Come usare BigInteger?


153

Ho questo pezzo di codice, che non funziona:

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

La variabile somma è sempre 0. Cosa sto facendo di sbagliato?


A proposito, la somma dovrebbe adattarsi facilmente int, quindi non è necessario BigIntegerper questo esempio.
notnoop,

8
No, ho cambiato il codice. Il numero è maggiore di 5000.
cc.

La questione legata come duplicato non sembrano avere lo stesso problema di questa domanda (la questione collegata è su quale funzione da utilizzare in modo BigInteger può essere aggiunto, questo è su come utilizzare la funzione add)
justhalf

Risposte:


203

BigIntegerè immutabile. Il javadocs afferma che add () "[r] restituisce un BigInteger il cui valore è (this + val)." Pertanto, non è possibile modificare sum, è necessario riassegnare il risultato del addmetodo alla sumvariabile.

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

1
int sarà sufficiente finché non supererai 2 ^ 31-1, sarà lungo finché non supererai 2 ^ 63-1.
Jean Hominal,

2
Che, nel suo esempio, non lo farà.
MarkPowell,

105
Ma è davvero così difficile pensare che forse abbia semplificato il suo esempio fino esattamente a qual è il problema?
thoshoshman,

@thecoshman - Hai ragione e il numero di voti sul tuo commento mostra che questo è un saggio consiglio per tutti i lettori di tali domande. Alcuni consigli più saggi sono " leggi cosa hanno scritto gli altri prima di rispondere o commentare " . Ad esempio, in questo caso non richiede nemmeno NESSUNA riflessione poiché l'OP ha chiaramente affermato di aver fatto proprio questo nei commenti sotto la domanda: " No, io ha cambiato il codice. Il numero è maggiore di 5000. "
OMY

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

La BigIntegerclasse è immutabile, quindi non puoi cambiarne lo stato. Quindi chiamare "aggiungi" crea un nuovo BigInteger, anziché modificare la corrente.


22

Altre risposte l'hanno inchiodato; BigInteger è immutabile. Ecco la modifica minore per far funzionare quel codice.

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

11

BigInteger è una classe immutabile. Quindi, ogni volta che fai qualsiasi aritmetica, devi riassegnare l'output a una variabile.


11

java.math.BigIntegerè una classe immutabile , quindi non possiamo assegnare nuovi oggetti nella posizione dell'oggetto già assegnato. Ma puoi creare un nuovo oggetto per assegnare un nuovo valore come:

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

3

Sì, è immutabile

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

quindi il metodo add () della classe BigInteger non aggiunge un nuovo valore BigIntger al proprio valore, ma crea e restituisce un nuovo riferimento BigInteger senza modificare l'attuale BigInteger e questo è ciò che è stato fatto anche nel caso delle stringhe


0

In realtà puoi usare,

BigInteger sum= new BigInteger("12345");

per la creazione di oggetti per la classe BigInteger. Ma il problema qui è che non puoi dare una variabile tra virgolette doppie. Quindi dobbiamo usare il metodo valueOf () e dobbiamo memorizzare di nuovo la risposta in quella somma. Quindi scriveremo,

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

0

Bigintegerè una classe immutabile. È necessario assegnare esplicitamente il valore dell'output per sommare in questo modo:

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

4
Questa è ora l'ottava risposta con la stessa spiegazione, quindi in che modo questa risposta è utile?
Tom,

-6

Dato che stai sommando alcuni valori int insieme, non è necessario utilizzare BigInteger. longè abbastanza per quello. intè 32 bit, mentre longè 64 bit, che può contenere la somma di tutti i valori int.


"Ma è davvero così difficile pensare che forse abbia semplificato il suo esempio fino esattamente a qual è il problema?" (citando il scemo)
Bulwersator,

5
Per questa domanda, la mia risposta è un po 'la nostra portata. Poiché l'argomento si concentra su come utilizzare BigInteger. Solo una mia esperienza personale, se vogliamo riassumere alcuni numeri interi e i numeri non sono abbastanza grandi, preferirei molto. Perché è facile da usare e funziona più velocemente. Per input su larga scala, BigInteger è la scelta giusta.
frank.liu,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.