2009-11-23 12 views
136

Ich habe dieses Stück Code, das funktioniert nicht:Java: Wie benutzt man BigInteger?

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

Die Summe Variable ist immer 0. Was mache ich falsch?

+0

By the way, sollte die Summe passen leicht in 'int', so dass Sie für dieses Beispiel brauchen' BigInteger' nicht. – notnoop

+5

Nein, ich habe den Code geändert. Die Anzahl ist größer als 5000. –

+0

Die als Duplikat verknüpfte Frage scheint nicht das gleiche Problem zu haben wie diese Frage (die verknüpfte Frage betrifft * die * Funktion, die verwendet werden kann, damit BigInteger hinzugefügt werden kann. Diese Frage bezieht sich auf * wie * die Funktion add) – justhalf

Antwort

176

BigInteger ist unveränderlich. Die Javadocs gibt an, dass add() "[r] einen BigInteger, dessen Wert ist (this + val)." Daher können Sie sum nicht ändern, müssen Sie das Ergebnis der add Methode zu sum Variable neu zuweisen.

sum = sum.add(BigInteger.valueOf(i)); 
+1

int wird ausreichen, solange du nicht über 2^31-1 gehst, lang genug, solange du nicht über 2^63-1 gehst. –

+2

Was in seinem Beispiel wird er nicht. – MarkPowell

+97

Aber ist es wirklich so schwer zu denken, dass er vielleicht sein Beispiel auf das Problem reduziert hat? – thecoshman

53
sum = sum.add(BigInteger.valueOf(i)) 

Die BigInteger Klasse ist unveränderlich, damit Sie seinen Zustand nicht ändern. Wenn Sie also "add" aufrufen, wird ein neuer BigInteger erstellt, anstatt den aktuellen Wert zu ändern.

10

BigInteger ist eine unveränderliche Klasse. Wann immer Sie eine Arithmetik durchführen, müssen Sie die Ausgabe einer Variablen neu zuweisen.

20

Andere Antworten haben es genagelt; 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)); 
    } 
} 
11

java.math.BigInteger ist eine unveränderlich Klasse, so dass wir nicht neues Objekt an der Stelle des bereits zugewiesenen Objekts zuweisen können. Aber Sie können neues Objekt erstellen neuen Wert zuweisen wie:

sum = sum.add(BigInteger.valueOf(i)); 
-6

Da Sie zusammen einige int-Werte werden zusammenfassend, gibt es keine Notwendigkeit BigInteger zu verwenden. long ist genug dafür. int ist 32 Bits, während long 64 Bits ist, die die Summe aller int-Werte enthalten können.

+0

"Aber ist es wirklich so schwer zu denken, dass er sein Beispiel vielleicht vereinfacht hat, um genau zu sehen, was das Problem ist?" (Zitat thecoshman) – Bulwersator

+2

Für diese Frage ist meine Antwort ein bisschen unser Umfang. Seit dem Thema konzentrieren sich auf die Verwendung von BigInteger. Nur eines meiner persönlichen Erfahrungen, wenn wir einige Ganzzahlen zusammenfassen wollen und die Zahlen nicht ganz groß sind, würde ich lieber lange halten. Weil das einfach zu bedienen ist und schneller läuft. Für große Eingaben ist BigInteger die gute Wahl. –

3

Ja, es ist Immutable

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

so dass die Methode add() von BigInteger Klasse fügt keinen neuen BigIntger Wert auf seinen eigenen Wert, aber erstellt und gibt eine neue BigInteger Referenz, ohne die aktuellen BigInteger zu verändern und das ist, was auch im Falle von Strings getan

0

Eigentlich verwenden Sie können

BigInteger sum= new BigInteger("12345"); 

für das Erstellen von Objekt für BigInteger-Klasse.Aber das Problem hier ist, können Sie keine Variable in den Anführungszeichen geben.So müssen wir die valueOf() Methode verwenden und wir müssen die Antwort in dieser Summe erneut speichern. So werden wir schreiben,

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

Biginteger ist eine unveränderliche Klasse. Sie müssen explizit Wert Ihrer Ausgabe zuweisen wie folgt zusammenfassen:

sum = sum.add(BigInteger.valueof(i));  
+4

Dies ist nun die achte Antwort mit der gleichen Erklärung, also wie ist diese Antwort hilfreich? – Tom