BigInteger: Zählt die Anzahl der Dezimalstellen in einer skalierbaren Methode

8

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?

    
Geoffrey De Smet 16.09.2013, 12:42
quelle

4 Antworten

5

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.

    
OldCurmudgeon 17.09.2013, 21:40
quelle
8

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.

    
dln385 21.05.2014 02:36
quelle
7

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 .

    
Dariusz 16.09.2013 12:50
quelle
1

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.

    
Truthseeker Rangwan 27.12.2014 07:28
quelle

Tags und Links