Wie benutzt man BigInteger?

153

Ich habe diesen Code, der nicht funktioniert:

BigInteger sum = BigInteger.valueOf(0);
for(int i = 2; i < 5000; i++) {
    if (isPrim(i)) {
        sum.add(BigInteger.valueOf(i));
    }
}

Die Summenvariable ist immer 0. Was mache ich falsch?

cc.
quelle
Übrigens sollte die Summe leicht passen int, so dass Sie BigIntegerfür dieses Beispiel nicht benötigen .
Notnoop
8
Nein, ich habe den Code geändert. Die Zahl ist größer als 5000.
cc.
Die Frage , als Duplikat verknüpft ist nicht das gleiche Problem wie diese Frage zu haben scheint (die verknüpfte Frage ist , welche Funktion zu verwenden , so BigInteger hinzugefügt werden kann, ist dies ein etwa wie die Add - Funktion verwenden)
justhalf

Antworten:

203

BigIntegerist unveränderlich. Die Javadocs geben an, dass add () "[r] eine BigInteger zurückgibt, deren Wert (this + val) ist." Daher können Sie nicht ändern sum, sondern müssen das Ergebnis der addMethode der sumVariablen neu zuweisen.

sum = sum.add(BigInteger.valueOf(i));
MarkPowell
quelle
1
int wird ausreichen, solange Sie nicht über 2 ^ 31-1 gehen, long wird ausreichen, solange Sie nicht über 2 ^ 63-1 gehen.
Jean Hominal
2
Was er in seinem Beispiel nicht tun wird.
MarkPowell
105
Aber ist es wirklich so schwer zu denken, dass er sein Beispiel auf genau das Problem vereinfacht hat?
Thecoshman
@thecoshman - Sie sind ganz richtig und die Anzahl der positiven Stimmen in Ihrem Kommentar zeigt, dass dies ein kluger Rat für alle Leser solcher Fragen ist. Einige weiser Rat ist , „ lesen Sie, was andere geschrieben haben, bevor er antwortete oder zu kommentieren. “ Zum Beispiel in diesem Fall ist es nicht einmal erforderlich , ANY Gedanken , da die OP klar gesagt , dass er es tat nur , dass in den Kommentaren unter der Frage: " Nein, ich hat den Code geändert. Die Nummer ist größer als 5000. "
OMY
58
sum = sum.add(BigInteger.valueOf(i))

Die BigIntegerKlasse ist unveränderlich, daher können Sie ihren Status nicht ändern. Wenn Sie also "Hinzufügen" aufrufen, wird ein neues erstellt BigInteger, anstatt das aktuelle zu ändern.

Bozho
quelle
22

Andere Antworten haben es geschafft; BigInteger ist unveränderlich. Hier ist die geringfügige Änderung, damit dieser Code funktioniert.

BigInteger sum = BigInteger.valueOf(0);
for(int i = 2; i < 5000; i++) {
    if (isPrim(i)) {
        sum = sum.add(BigInteger.valueOf(i));
    }
}
Dean J.
quelle
11

BigInteger ist eine unveränderliche Klasse. Wenn Sie also eine Arithmetik ausführen, müssen Sie die Ausgabe einer Variablen neu zuweisen.

Zeiger
quelle
11

java.math.BigIntegerist eine unveränderliche Klasse, daher können wir kein neues Objekt an der Position des bereits zugewiesenen Objekts zuweisen. Sie können jedoch ein neues Objekt erstellen, um einen neuen Wert zuzuweisen, z.

sum = sum.add(BigInteger.valueOf(i));
Arvind
quelle
3

Ja, es ist unveränderlich

sum.add(BigInteger.valueOf(i));

Die Methode add () der BigInteger-Klasse fügt also keinen neuen BigIntger-Wert zu ihrem eigenen Wert hinzu, sondern erstellt eine neue BigInteger-Referenz und gibt sie zurück, ohne die aktuelle BigInteger zu ändern. Dies ist auch bei Strings der Fall

murali krish
quelle
0

Eigentlich kann man verwenden,

BigInteger sum= new BigInteger("12345");

Das Problem hier ist jedoch, dass Sie in den doppelten Anführungszeichen keine Variable angeben können. Wir müssen also die Methode valueOf () verwenden und die Antwort erneut in dieser Summe speichern.

sum= sum.add(BigInteger.valueOf(i));
Harry
quelle
0

Bigintegerist eine unveränderliche Klasse. Sie müssen den Wert Ihrer Ausgabe explizit der Summe wie folgt zuweisen:

sum = sum.add(BigInteger.valueof(i));    
Arpna Joshi
quelle
4
Dies ist jetzt die 8. Antwort mit derselben Erklärung. Wie ist diese Antwort hilfreich?
Tom
-6

Da Sie einige int-Werte zusammenfassen, muss BigInteger nicht verwendet werden. longist genug dafür. intbeträgt 32 Bit, während long64 Bit die Summe aller int-Werte enthalten können.

frank.liu
quelle
"Aber ist es wirklich so schwer zu denken, dass er sein Beispiel auf genau das Problem vereinfacht hat?" (zitiert thecoshman)
Bulwersator
5
Auf diese Frage ist meine Antwort ein bisschen unser Umfang. Da sich das Thema auf die Verwendung von BigInteger konzentriert. Nur eine meiner persönlichen Erfahrungen, wenn wir einige ganze Zahlen zusammenfassen wollen und die Zahlen nicht ziemlich groß sind, würde ich lange bevorzugen. Weil das einfach zu bedienen ist und schneller läuft. Für Eingaben in großem Maßstab ist BigInteger die gute Wahl.
frank.liu