Letzten beiden Ziffern eines BigIntegers bestimmen?

Status
Nicht offen für weitere Antworten.
W

Wastl

Gast
Hallo,

hab hier eine BigInteger Zahl. Wie bestimme ich möglichst effizient die letzten beiden Ziffern dieser Zahl?
Im Moment mache ich das noch so:

Code:
BigInteger r = new BigInteger("123433523423445812323473248762384");
String suffix = r.toString();
int lc1 = Integer.parseInt(suffix.substring(suffix.length()-2, suffix.length()-1));
int lc2 = Integer.parseInt(suffix.substring(suffix.length()-1, suffix.length()));

Diese Methode ist aber sehr ineffizient, leider.
 

Tellerrand

Bekanntes Mitglied
public BigInteger mod(BigInteger m)
Liefert den Divisionsrest von diesem Objekt mit dem Divisor m in einem neuen BigInteger-Objekt zurück.
Exception: ArithmeticException
* Falls m kleiner gleich null ist.


Teile durch 100 und nehme den Rest.
Fraglich ist aber ob Modulo schneller ist :/
 
W

Wastl

Gast
hm die Methode mit Modulo ist gut, funktioniert aber leider nicht wenn die Zahl z.B. so aussieht:
wenn beispielsweise r = 483485307
Code:
String suffix = r.mod(new BigInteger("100")).toString();
int lc1 = Integer.parseInt(suffix.substring(suffix.length()-2, suffix.length()-1));
int lc2 = Integer.parseInt(suffix.substring(suffix.length()-1, suffix.length()));[code]
denn dann ist suffix = 7 und dann gibts eine String index out of range exception
 

Tellerrand

Bekanntes Mitglied
Wastl hat gesagt.:
hm die Methode mit Modulo ist gut, funktioniert aber leider nicht wenn die Zahl z.B. so aussieht:
wenn beispielsweise r = 483485307
Code:
String suffix = r.mod(new BigInteger("100")).toString();
int lc1 = Integer.parseInt(suffix.substring(suffix.length()-2, suffix.length()-1));
int lc2 = Integer.parseInt(suffix.substring(suffix.length()-1, suffix.length()));[code]
denn dann ist suffix = 7 und dann gibts eine String index out of range exception

Also wenn dann bitte:
int b = x.mod(new BigInteger("10")).intValue();
int a = x.mod(new BigInteger("100")).substract(b).divide(new BigInteger("10")).intValue();
oder so ähnlich kann es grad nicht testen.

Und ja, gibt bestimmt bessere Lösungen ;)
 
W

Wastl

Gast
aja, so gehts.
allerdings ist die von mir oben gepostete methode immer noch schneller als der weg über modulo :-/
 

Tellerrand

Bekanntes Mitglied
Dann aml sowas in der Art
int b = x.mod(new BigInteger("10")).intValue();
int a = ((x.mod(new BigInteger("100")).intValue()) -b )/10;
da spart man sich ein wenig Zeugs.
Oder liegt es an der Modulo Operation an sich?
 

Lim_Dul

Top Contributor
Wenn nur 1x module 100 und dann Auswerten, die modulo Operation dürfte teuer sein:

Code:
int a = (x.mod(new BigInteger("100")).intValue();
int letzteStelle = a % 10;
int vorletzteStelle = a/10;
(In Strings bitte selber umwandeln ;))
 

Tellerrand

Bekanntes Mitglied
Das kommt davon wenn man nicht nachdenkt bevor man schreibt :autsch:

Wobei ich glaube das Modulo je nach Implementierung von BigInteger recht schnell ist sein kann.
Aber ich weiß ja nciht was die da so mit getrieben haben :D
 

Marco13

Top Contributor
Ach ja, ich immer mit meinen ausführlichen Antworten und Tests :rolleyes:

Aber vielleicht interessiert's ja noch jemanden...
Code:
import java.math.*;


class BigIntegerTest
{

    static long runs = 1;
    public static void main(String args[])
    {
        BigInteger r = new BigInteger("123433523423445812323473248762384");
        for (runs = 1000; runs <= 1000000; runs*=10)
        {
            testA(r);
            testB(r);
            testC(r);
        }
    }


    private static void testA(BigInteger r)
    {
        long startTime = System.nanoTime();
        long result = 0;

        for (int i=0; i<runs; i++)
        {
            String suffix = r.toString();
            int lc1 = Integer.parseInt(suffix.substring(suffix.length()-2, suffix.length()-1));
            int lc2 = Integer.parseInt(suffix.substring(suffix.length()-1, suffix.length()));
            //System.out.println("A "+lc1+" "+lc2);
            result += lc1+lc2;
        }

        long estimatedTime = System.nanoTime() - startTime;
        System.out.println("A "+result+ " time "+(float)estimatedTime/1000000+" ms");
    }


    private static void testB(BigInteger x)
    {
        long startTime = System.nanoTime();
        long result = 0;

        for (int i=0; i<runs; i++)
        {
            int b = x.mod(new BigInteger("10")).intValue();
            int a = x.mod(new BigInteger("100")).subtract(new BigInteger(""+b)).divide(new BigInteger("10")).intValue();
            result += a+b;
            //System.out.println("B "+a+" "+b);
        }

        long estimatedTime = System.nanoTime() - startTime;
        System.out.println("B "+result+ " time "+(float)estimatedTime/1000000+" ms");
    }

    private static final BigInteger b100 = new BigInteger("100");

    private static void testC(BigInteger x)
    {
        long startTime = System.nanoTime();
        long result = 0;

        for (int i=0; i<runs; i++)
        {
            int y = (int)x.mod(b100).longValue();
            int a = y / 10;
            int b = y % 10;
            //System.out.println("C "+a+" "+b);
            result += a+b;
        }

        long estimatedTime = System.nanoTime() - startTime;
        System.out.println("C "+result+ " time "+(float)estimatedTime/1000000+" ms");
    }


}
 
W

Wastl

Gast
Code:
int a = (r.mod(new BigInteger("100")).intValue());
int lc1 = a%10;
int lc2 = a/10;
das ist leider auch langsamer als meine methode im ersten posting.

und charAt funktioniert irgendwie nicht:
Code:
String suffix = r.toString();
int lc1 = suffix.charAt(suffix.length()-2);
int lc2 = suffix.charAt(suffix.length()-1);
 

Marco13

Top Contributor
Man weiß ja nicht, WO und WIE (in der "echten" Anwendung) diese Methode aufgerufen wird - die Alternative wäre, EINEN aufruf der Methode zu messen, und ob das so viel genauer wäre.... ? :wink:
 

Lim_Dul

Top Contributor
Marco13 hat gesagt.:
Man weiß ja nicht, WO und WIE (in der "echten" Anwendung) diese Methode aufgerufen wird - die Alternative wäre, EINEN aufruf der Methode zu messen, und ob das so viel genauer wäre.... ? :wink:

Du müsstest testA, testB, testC getrennt aufrufen.
 

Marco13

Top Contributor
Jedem, der das Programm laufen läßt, steht es frei, jeweils ZWEI der drei Zeilen testA/testB/testC auszukommentieren, und die Tests getrennt zu machen :wink: Allerdings sind die Unterschiede aufgrund des Programmablaufes (größer werdende Testfälle, viele Durchläufe) ziemlich schnell vernachlässigbar gering:

A 12000 time 59.076794 ms
B 12000 time 23.715015 ms
C 12000 time 1.223878 ms
A 120000 time 33.12588 ms
B 120000 time 35.016804 ms
C 120000 time 9.428851 ms
A 1200000 time 264.51123 ms
B 1200000 time 255.88014 ms
C 1200000 time 66.320564 ms
A 12000000 time 2444.4995 ms
B 12000000 time 2382.9854 ms
C 12000000 time 584.097 ms


A 12000 time 32.478184 ms
A 120000 time 37.2518 ms
A 1200000 time 272.8278 ms
A 12000000 time 2489.099 ms

B 12000 time 36.837086 ms
B 120000 time 40.783295 ms
B 1200000 time 269.23645 ms
B 12000000 time 2383.6587 ms

C 12000 time 8.278429 ms
C 120000 time 15.750715 ms
C 1200000 time 70.19173 ms
C 12000000 time 598.4957 ms
 

Tellerrand

Bekanntes Mitglied
Bei dem Test stellt sich doch erstmal die Frage was der JIT Compiler macht.

Kenn mich zwar mit den Optimierungsmethoden des JIT C nicht aus, aber da ist doch so einiges nicht sicher.

Wenn ich mir sowas anschaue stellen sich mir jedenfalls einige Fragen ;)
C 12000 time 8.278429 ms
C 120000 time 15.750715 ms
C 1200000 time 70.19173 ms
C 12000000 time 598.4957 ms
 

Marco13

Top Contributor
Naja - bei den ersten beiden schlägt auch noch die Ungenauigkeit des Timers zu - auch wenn es "nanoTime" heißt, kann er schon mal 10 oder 20 ms falsch liegen (darum auch Tests mit VIELEN Durchläufen). Zumindest zwischen den letzten beiden ist der Faktor "ungefähr" 10, was man ja erwarten würde...
EDIT: Geschrieben hatte ich das auf einem Rechner, der ca. 3 mal so langsam war, wie der, wo ich jetzt die neuen Testläufe gemacht habe, d.h. da fielen auch beim 2. Durchlauf diese Ungenauigkeiten noch nicht sooo ins Gewicht (und NOCH ein 10x so langer Durchlauf wäre mir auf dem anderen Rechner zu langweilig geworden :wink: )
 
Status
Nicht offen für weitere Antworten.
Ähnliche Java Themen
  Titel Forum Antworten Datum
ixChronos Letzten 4 Ziffern einer großen Zahl ausgeben Java Basics - Anfänger-Themen 3
F wie kann ich die Position des letzten Vokals innerhalb einer Zeichenkette ermitteln? Java Basics - Anfänger-Themen 5
Jambolo Methode, welche die 3 letzten Parameter Werte speichert Java Basics - Anfänger-Themen 20
I Array übernimmt immer den letzten Input. Java Basics - Anfänger-Themen 14
S switch case fängt beim letzten case an Java Basics - Anfänger-Themen 6
C HashMap - alle keys haben values der letzten put-Anweisung Java Basics - Anfänger-Themen 3
F ByteBuffer Fehler bei den letzten 2 Bytes Java Basics - Anfänger-Themen 1
P 2D Array auslesen gibt nur letzten Wert aus Java Basics - Anfänger-Themen 11
K BufferedWriter schreibt die letzten paar Zeilen nicht Java Basics - Anfänger-Themen 5
S Filelist Ausgabe (nur den letzten teil) Java Basics - Anfänger-Themen 8
J Letzten 4 Zeichen auslesen und nicht interpretieren Java Basics - Anfänger-Themen 2
M Die letzten Zeichen eines Strings Java Basics - Anfänger-Themen 6
A JFileChooser soll sich letzten ordner merken Java Basics - Anfänger-Themen 4
1 Zeit und Datum der Letzten Bearbeitung einer Datei auslesen Java Basics - Anfänger-Themen 3
A setBounds beim letzten objekt Java Basics - Anfänger-Themen 5
T die letzten X zeilen einer datei entfernen Java Basics - Anfänger-Themen 19
R Werte der letzten 10 sek aus HashMap löschen Java Basics - Anfänger-Themen 14
I aus 2 random zahlen soll nur die ungerade summe der beiden genommen werden. Java Basics - Anfänger-Themen 13
B Datentypen Werte in einen Array einlesen und danach die beiden höchsten Werte wieder ausgeben Java Basics - Anfänger-Themen 3
A Die Werte der ersten beiden markierten Check-Boxen registrieren Java Basics - Anfänger-Themen 11
R void? static? beide? garnichtst von beiden? Java Basics - Anfänger-Themen 11
Shadowrunner Variablen Gibt es eine Möglichkeit die Ziffern/Stellen einer Zahl fest zu legen? Java Basics - Anfänger-Themen 3
B Alle Zahlen finden, die 3 bestimmte Ziffern enthalten? Java Basics - Anfänger-Themen 9
obiwanke Ziffern durch ASCII Character ersetzen Java Basics - Anfänger-Themen 8
M LCD-Ziffern-Hilfe Java Basics - Anfänger-Themen 6
Marlena Bauer LCD Ziffern Java Basics - Anfänger-Themen 13
sashady Zahlen rekursiv zerlegen und Ziffern addieren Java Basics - Anfänger-Themen 38
Khaled-Abo Ziffern unterscheiden mittels einer For-Schleife Java Basics - Anfänger-Themen 6
C alle möglichen Kombinationen zweier Ziffern auf drei / vier / und 'n" Stellen Java Basics - Anfänger-Themen 11
Kingamadeus2000 Anzahl der Ziffern der kürzesten Zahl aus einem zurückliefern Java Basics - Anfänger-Themen 1
G Überprüfen ob alle Ziffern von 1-9 in einem Integer vorhanden sind Java Basics - Anfänger-Themen 6
I Arabische Ziffern in römische Ziffern Java Basics - Anfänger-Themen 1
J Rekursive Methode - Ziffern einer Zahl ausgeben Java Basics - Anfänger-Themen 2
F Produkt d. Ziffern einer Zahl..?! Java Basics - Anfänger-Themen 5
L (Integer) Liste nach aufsteigender Summe der Ziffern sortieren (mit Bedingung) Java Basics - Anfänger-Themen 8
C Datentypen String aus Ziffern erhöhen und als String zurückgeben Java Basics - Anfänger-Themen 16
P vokale konsonanten ziffern satzzeichen aus string lesen. hab kiene ahnung Java Basics - Anfänger-Themen 10
E String bestehend aus Ziffern in Zahl verwandeln Java Basics - Anfänger-Themen 3
W Methoden Ausgabe true wenn nur Ziffern <= 1 vorhanden Java Basics - Anfänger-Themen 9
J Skalierung von Ziffern Java Basics - Anfänger-Themen 10
K wiederholung von ziffern Java Basics - Anfänger-Themen 3
K double-Wert aus einzelnen Ziffern erzeugen Java Basics - Anfänger-Themen 7
T Ziffern anordnen Java Basics - Anfänger-Themen 3
P Arabische (indische) Ziffern Java Basics - Anfänger-Themen 4
M Methode für nur Ziffern?? Java Basics - Anfänger-Themen 3
B Auf die Ziffern einer Zahl zugreifen Java Basics - Anfänger-Themen 6
C Rekursive Methode - Ziffern in Zahl Java Basics - Anfänger-Themen 33
Haave EAN-13-Prüfziffer: Vermeiden von Eingaben mit mehr/weniger als 12 Ziffern Java Basics - Anfänger-Themen 3
G 9-stellige Zahl mit den Ziffern 1-9 Java Basics - Anfänger-Themen 2
D Einzelne Ziffern aus einem String Java Basics - Anfänger-Themen 10
N Wie kann ich Ziffern einer eingegenen Zahl adressieren? Java Basics - Anfänger-Themen 6
B Ziffern erkennung Java Basics - Anfänger-Themen 4
N Römische Zahlen in Arabische Ziffern umgewandeln Java Basics - Anfänger-Themen 18
G Summe der Ziffern einer Zahl EFFIZIENT berechnen? Java Basics - Anfänger-Themen 18
G String auf Ziffern prüfen Java Basics - Anfänger-Themen 30
B Eingabe von Ziffern prüfen Java Basics - Anfänger-Themen 3
G Ziffern tauschen Java Basics - Anfänger-Themen 15
M Römische Ziffern Java Basics - Anfänger-Themen 5
G Wie eine Int Zahl in die einzelnen Ziffern zerlegen? Java Basics - Anfänger-Themen 6
L Anzahl der Eingegebenen Ziffern ausgeben? Java Basics - Anfänger-Themen 7
M nur Ziffern dürfen eingetippt werden Java Basics - Anfänger-Themen 10
F Ziffern einer eingelesenen Zahl ausgeben bzw. bearbeiten Java Basics - Anfänger-Themen 4
S Anzahl der Ziffern einer Zahl Java Basics - Anfänger-Themen 10

Ähnliche Java Themen

Neue Themen


Oben