Ich brauche die Anzahl der Dezimalstellen eines BigInteger
. Zum Beispiel:
99
gibt 2
zurück
1234
gibt 4
zurück
9999
gibt 4
zurück
12345678901234567890
gibt 20
zurück
Ich muss dies tun für eine BigInteger
mit 184948
Dezimalziffern und mehr . Wie kann ich das schnell und skalierbar machen?
Der Ansatz convert-to-String ist langsam:
%Vor%Dieser loop-devide-by-ten Ansatz ist noch langsamer:
%Vor%Gibt es schnellere Methoden?
Das sieht so aus, als ob es funktioniert. Ich habe noch keine erschöpfenden Tests durchgeführt, aber ich habe keine Zeittests durchgeführt, aber es scheint eine vernünftige Laufzeit zu haben.
%Vor%Es dauerte ungefähr 3 Sekunden auf meinem Celeron M Laptop, so dass es unter 2 Sekunden auf einem anständigen Kit schlagen sollte.
Hier ist eine schnelle Methode basierend auf Dariusz 'Antwort :
%Vor%Der folgende Code testet die Zahlen 1, 9, 10, 99, 100, 999, 1000 usw. bis zu zehntausend Ziffern:
%Vor% Dies kann eine BigInteger
mit 184,948
Dezimalziffern und mehr in weniger als einer Sekunde überprüfen.
Ich denke, dass Sie bitLength () verwenden könnten. , um einen log2-Wert zu erhalten, ändern Sie die Basis in 10 .
Das Ergebnis kann jedoch um eine Ziffer falsch sein, also ist dies nur eine Annäherung.
Wenn dies jedoch akzeptabel ist, könnten Sie immer 1 zum Ergebnis hinzufügen und es so binden, dass es höchstens ist. Oder subtrahiere 1 und erhalte mindestens .
Dies ist eine andere Möglichkeit, es schneller zu machen als die Methode "In String konvertieren". Nicht die beste Laufzeit, aber immer noch vernünftige 0,65 Sekunden im Vergleich zu 2,46 Sekunden mit Convert-to-String-Methode (bei 180000 Ziffern).
Diese Methode berechnet den ganzzahligen Teil des Logarithmus der Basis 10 aus dem angegebenen Wert. Anstatt Loop-Divide zu verwenden, wird jedoch eine Technik verwendet, die der Potenzierung durch Quadrieren ähnelt.
Hier ist eine grobe Implementierung, die die zuvor erwähnte Laufzeit erreicht:
%Vor%Hoffe, das wird helfen.
Tags und Links java biginteger