2009-08-12 12 views
4

Ich versuche 100 zu berechnen! und es scheint keine eingebaute faktorielle Funktion zu geben. So habe ich geschrieben:Ein Wert größer als ULong? Rechnen 100!

Protected Sub ComputeFactorial(ByVal n As ULong) 
     Dim factorial As ULong = 1 
     Dim i As Integer 
     For i = 1 To n 
      factorial = factorial * i 
     Next 
     lblAnswer.Text = factorial 
    End Sub 

Leider ist dies läuft mit dem Wert von 100 für n rseults in

Wert war zu groß oder zu klein für ein UInt64.

Gibt es also einen größeren Datentyp für die Zahlen? Bin ich in meinen Methoden falsch? Bin ich hilflos?

+1

Warum nimmst du nicht die Gelegenheit und schreibst selbst eine Bigint-Klasse? Es ist ein bisschen mehr im Geiste des Euler Projekts ... :) – Guffa

+0

Für das Protokoll: \t 100! ~ = 9.33262154 × 10^157 – Robert

+0

@Guffa wenn ich nur wüsste wo ich anfangen soll, hahah – Chris

Antwort

7

Klingt wie Projekt Euler.

.NET 4.0 hat System.Numerics.BigInteger, oder Sie können hier eine ziemlich süß Implementierung holen:
C# BigInteger Class

Edit: treed :(

Ich werde hinzufügen - die Version bei Codeproject hat zusätzliche Funktionen wie Integer-Quadratwurzel, einen Primalitätstest, Lucas-Sequenz-Generierung.Außerdem haben Sie keinen direkten Zugriff auf den Puffer in der .NET-Implementierung, die für ein paar Dinge, die ich versuchte, ärgerlich war

+0

In der Tat, Projekt Euler! Ich nehme an, ich muss mit einer dieser anderen Klassen gehen. Ziemlich unglücklich! – Chris

+0

Sei nicht traurig - ich habe den von CodeProject benutzt, als ich in 7 Tagen 80 Probleme hatte. Ich stoppte kurz danach - dumm ADD. : o –

0

Sie benötigen eine Implementierung von "BigNums". Dies sind Ganzzahlen, die Speicher dynamisch zuweisen, damit sie ihren Wert behalten können.

Eine Version war eigentlich cut from the BCL.

Die J # -Bibliothek verfügt über eine Implementierung java.math.BigInteger, die Sie aus jeder Sprache verwenden können.

Alternativ, wenn Genauigkeit/Genauigkeit kein Problem sind (Sie kümmern sich nur um Größenordnung), können Sie einfach 64-Bit-Floats verwenden.

0

dezimal wird Handle 0 bis +/- 79,228,162,514,264,3 37.593.543.950.335 ohne Dezimalpunkt (Skala von Null)

+0

Wert war entweder zu groß oder zu klein für eine Dezimalzahl. – Chris

1

Hinweis: Verwenden Sie ein Array, um die Ziffern der Nummer zu speichern. Sie können durch Inspektion feststellen, dass das Ergebnis nicht mehr als 200 Ziffern haben wird.

Verwandte Themen