Comment utiliser BigInteger?

153

J'ai ce morceau de code qui ne fonctionne pas:

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

La variable somme est toujours 0. Que fais-je mal?

cc.
la source
À propos, la somme devrait facilement s'intégrer int, vous n'avez donc pas besoin BigIntegerde cet exemple.
notnoop
8
Non, j'ai changé le code. Le nombre est supérieur à 5000.
cc.
La question liée en double ne semble pas avoir le même problème que cette question (la question liée est sur le point qui fonction à utiliser si BigInteger peut être ajouté, celui - ci est sur la façon d'utiliser la fonction d'ajout)
justhalf

Réponses:

203

BigIntegerest immuable. Les javadocs indiquent que add () "[r] et renvoie un BigInteger dont la valeur est (this + val)." Par conséquent, vous ne pouvez pas changer sum, vous devez réaffecter le résultat de la addméthode à sumvariable.

sum = sum.add(BigInteger.valueOf(i));
MarkPowell
la source
1
int sera suffisant tant que vous ne dépassez pas 2 ^ 31-1, long suffira tant que vous ne dépasserez pas 2 ^ 63-1.
Jean Hominal
2
Ce qui, dans son exemple, ne le fera pas.
MarkPowell
105
Mais est-il vraiment si difficile de penser qu'il a peut-être simplifié son exemple pour déterminer exactement le problème?
thecoshman
@thecoshman - Vous avez tout à fait raison et le nombre de votes positifs sur votre commentaire montre que c'est un conseil judicieux pour tous les lecteurs de ces questions. Un conseil plus sage est de " lire ce que les autres ont écrit avant de répondre ou de commenter. " Par exemple, dans ce cas, cela ne nécessite même AUCUNE réflexion puisque le PO a clairement déclaré qu'il a fait exactement cela dans les commentaires sous la question: " Non, je a changé le code. Le nombre est supérieur à 5000. "
OMY
58
sum = sum.add(BigInteger.valueOf(i))

La BigIntegerclasse est immuable, vous ne pouvez donc pas changer son état. Donc, appeler "add" crée un nouveau BigInteger, plutôt que de modifier le courant.

Bozho
la source
22

D'autres réponses l'ont cloué; BigInteger est immuable. Voici la modification mineure pour que ce code fonctionne.

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

BigInteger est une classe immuable. Ainsi, chaque fois que vous faites de l'arithmétique, vous devez réaffecter la sortie à une variable.

Poindexter
la source
11

java.math.BigIntegerest une classe immuable , nous ne pouvons donc pas affecter de nouvel objet à l'emplacement de l'objet déjà attribué. Mais vous pouvez créer un nouvel objet pour attribuer une nouvelle valeur comme:

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

Oui c'est immuable

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

donc la méthode add () de la classe BigInteger n'ajoute pas de nouvelle valeur BigIntger à sa propre valeur, mais crée et retourne une nouvelle référence BigInteger sans changer le BigInteger actuel et c'est ce qui est fait même dans le cas de Strings

murali krish
la source
0

En fait, vous pouvez utiliser,

BigInteger sum= new BigInteger("12345");

pour créer un objet pour la classe BigInteger.Mais le problème ici est que vous ne pouvez pas donner de variable entre guillemets doubles.Nous devons donc utiliser la méthode valueOf () et nous devons à nouveau stocker la réponse dans cette somme.Nous allons donc écrire,

sum= sum.add(BigInteger.valueOf(i));
harry
la source
0

Bigintegerest une classe immuable. Vous devez attribuer explicitement la valeur de votre sortie à la somme comme ceci:

sum = sum.add(BigInteger.valueof(i));    
Arpna Joshi
la source
4
C'est maintenant la 8ème réponse avec la même explication, alors en quoi cette réponse est-elle utile?
Tom
-6

Puisque vous résumez ensemble certaines valeurs int, il n'est pas nécessaire d'utiliser BigInteger. longsuffit pour cela. intest de 32 bits, tandis que de long64 bits, qui peut contenir la somme de toutes les valeurs int.

frank.liu
la source
"Mais est-ce vraiment si difficile de penser qu'il a peut-être simplifié son exemple à exactement quel est le problème?" (citant thecoshman)
Bulwersator
5
Pour cette question, ma réponse est un peu de notre portée. Puisque le sujet se concentre sur l'utilisation de BigInteger. Juste une de mon expérience personnelle, si nous voulons résumer des nombres entiers et que les nombres ne sont pas assez gros, je préférerais long. Parce que c'est facile à utiliser et plus rapide. Pour les entrées à grande échelle, BigInteger est le bon choix.
frank.liu