2014-11-28 9 views
5

Wie könnte ich alle Ziffern von großen Zahlen wie 9999! (Faktor 9999) in Java berechnen und anzeigen?So berechnen und zeigen große Zahlen in Java

Werfen Sie einen Blick auf diese url, die 9999! berechnet und alle Ziffern verteilt.

+2

[BigInteger] (https://docs.oracle.com/javase/8/docs/api/java/math/BigInteger.html) –

+0

@JoopEggen BigInteger ist super langsam! :) –

+0

@SarthakMittal, aber nicht suboptimal codiert. Entweder benutzen Sie Ihre Prozessoren: Java 8 hat einige nette Parallelitätsoptionen (IntStream parallel), oder schreiben Sie, um die GPU zu verwenden und Array-Verarbeitung zu machen. –

Antwort

4

Verwenden Sie BigInteger; 9999! dauerte 120 ms mit Java 8. Hier ist eine Version, die longs verwendet, und halbiert diese Zeit:

+1

Nette Lösung ohne 'StackOverFlow' Ausnahme –

+0

Das scheint besser zu funktionieren. – weston

+1

Oh Junge, Überlauf kann nicht mit 'Faktor * i <= Faktor getestet werden. Glücklicherweise ist die zeitliche Wirkung noch in Ordnung. 'If ​​(Long.highestOneBit (factor) + Integer.highestOneBit (i)> 31) {' ist leider teurer. –

7

Verwendung BigInteger, seine Grenze ist Ihr Gedächtnis

public static BigInteger factorial(BigInteger num) { 
    if (num.compareTo(new BigInteger("1")) < 0) { 
     return new BigInteger("1"); 
    } else { 
     return factorial(num.subtract(new BigInteger("1"))).multiply(num) ; 
    } 
} 
+5

Es gibt ein anderes Limit. Der Aufrufstapel. 'faktoriell (9999)' würde 9999 Stack-Frames bedeuten. Ich habe es nicht ausprobiert, und es hängt von deiner Stapelgröße ab, aber das ist eine Menge und ist anfällig für 'StackOverflow'. Die Lösung, da dies rekursiv ist, ist einfach - wechseln Sie zu einer Schleife. – weston

4

Die Java-Standardbibliothek bieten eine BigInteger-Klasse, die unbegrenzte ganzzahlige Werte darstellen kann (tatsächlich, sie sind begrenzt, aber nur durch den verfügbaren Speicherplatz).

1

Sie können Strings verwenden (ja nicht erstaunt, Sie können!). Ein Programm kann in Strings erstellt werden, um zwei sehr große Zahlen zu multiplizieren (hier spreche ich über Zahlen sagen 5000 Ziffern in der Länge!) Ich habe sie bereits für Addition und Subtraktion erstellt und es ist nicht so schwer, es für Multiplikation und erstellen Ich versichere Ihnen, dass, obwohl Sie denken, dass die Verwendung von BigInteger wird schneller sein, aber die Verwendung von Strings wäre Ultrafast im Vergleich zu BigInt.

Und die Sache, die meine Mitte rutschte, habe ich StringBuilder-Klasse verwendet, um das Programm effizienter zu machen.

+0

Ich sehe, obwohl Strings wie BigInteger auch unveränderlich sind? Verwenden Sie zuerst 'StringBuilder' oder' char [] '? –

+1

lol, yeah, du hast mich komplett verstanden, ich habe StringBuilder :) benutzt, tut mir leid, dass ich es nicht erwähnt habe, lass mich meine Antwort so editieren, dass die Leute nicht irregeführt werden :) –

+2

Können wir diesen Code irgendwo sehen? – weston

2

Nicht die schnellste, aber auch nicht wirklich langsam.

public static BigInteger factorial(int n) { 
    BigInteger result = BigInteger.ONE; 
    for (int i = 2; i <= n; i++) { 
     result = result.multiply(BigInteger.valueOf(i)); 
    } 
    return result; 
}