Как использовать BigInteger?

У меня есть код, который не работает:

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

Переменная суммы всегда равна 0. Что я делаю не так?


person cc.    schedule 23.11.2009    source источник
comment
Кстати, сумма должна легко уместиться в int, так что BigInteger для этого примера вам не понадобится.   -  person notnoop    schedule 23.11.2009
comment
Нет, я поменял код. Число больше 5000.   -  person cc.    schedule 23.11.2009
comment
Вопрос, связанный как дубликат, похоже, не имеет той же проблемы, что и этот вопрос (связанный вопрос касается какую функцию использовать, чтобы можно было добавить BigInteger, этот вопрос о как использовать функцию добавления)   -  person justhalf    schedule 23.12.2015


Ответы (9)


BigInteger неизменен. В javadocs указано, что add () "[r] возвращает BigInteger, значение которого равно (this + val)." Следовательно, вы не можете изменить sum, вам нужно переназначить результат метода add переменной sum.

sum = sum.add(BigInteger.valueOf(i));
person MarkPowell    schedule 23.11.2009
comment
int будет достаточно, пока вы не перейдете на 2 ^ 31-1, long будет достаточно, пока вы не перейдете на 2 ^ 63-1. - person Jean Hominal; 23.11.2009
comment
А в его примере он этого не сделает. - person MarkPowell; 23.11.2009
comment
Но действительно ли так сложно представить, что он упростил свой пример до того, в чем именно заключается проблема? - person thecoshman; 24.07.2013
comment
@thecoshman - Вы совершенно правы, и количество голосов за ваш комментарий показывает, что это мудрый совет для всех, кто задает подобные вопросы. Еще один более мудрый совет: прочтите, что написали другие, прежде чем отвечать или комментировать. Например, в этом случае это даже не требует ЛЮБОЙ мысли, поскольку ОП четко заявил, что он просто что в комментариях под Вопросом: Нет, я изменил код. Число больше 5000. - person O.M.Y.; 08.04.2018

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

Класс BigInteger неизменен, поэтому вы не можете изменить его состояние. Таким образом, вызов «добавить» создает новый BigInteger, а не изменяет текущий.

person Bozho    schedule 23.11.2009

Другие ответы подтвердили это; BigInteger неизменен. Вот небольшое изменение, чтобы этот код заработал.

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

BigInteger - неизменяемый класс. Поэтому всякий раз, когда вы выполняете какие-либо арифметические операции, вы должны переназначить вывод переменной.

person Poindexter    schedule 23.11.2009

java.math.BigInteger - это неизменяемый класс, поэтому мы не можем назначить новый объект на место уже назначенного объекта. Но вы можете создать новый объект для присвоения нового значения, например:

sum = sum.add(BigInteger.valueOf(i));
person Arvind    schedule 25.04.2013

Да, это неизменный

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

поэтому метод add () класса BigInteger не добавляет новое значение BigIntger к своему собственному значению, а создает и возвращает новую ссылку BigInteger без изменения текущего BigInteger и это то, что делается даже в случай со строками

person murali krish    schedule 16.06.2015

На самом деле вы можете использовать,

BigInteger sum= new BigInteger("12345");

для создания объекта для класса BigInteger. Но проблема здесь в том, что вы не можете указать переменную в двойных кавычках, поэтому мы должны использовать метод valueOf (), и мы должны сохранить ответ в этой сумме снова. Итак, мы напишем,

sum= sum.add(BigInteger.valueOf(i));
person harry    schedule 01.10.2015

Biginteger - неизменяемый класс. Вам нужно явно назначить значение вашего вывода для такой суммы:

sum = sum.add(BigInteger.valueof(i));    
person Arpna Joshi    schedule 09.10.2016
comment
Это восьмой ответ с таким же объяснением, так чем же полезен этот ответ? - person Tom; 09.10.2016

Поскольку вы суммируете некоторые значения int вместе, нет необходимости использовать BigInteger. long для этого достаточно. int - 32 бита, а long - 64 бита, которые могут содержать сумму всех значений типа int.

person frank.liu    schedule 07.09.2013
comment
Но действительно ли так сложно представить, что он упростил свой пример до того, в чем именно заключается проблема? (цитирует Кошмана) - person Bulwersator; 03.01.2014
comment
На этот вопрос мой ответ немного ограничен. Поскольку тема сосредоточена на том, как использовать BigInteger. Просто один из моих личных опытов: если мы хотим суммировать некоторые целые числа, а числа не очень большие, я бы предпочел long. Потому что это удобно и работает быстрее. Для крупномасштабного ввода BigInteger - хороший выбор. - person frank.liu; 07.01.2014