У меня есть код, который не работает:
BigInteger sum = BigInteger.valueOf(0);
for(int i = 2; i < 5000; i++) {
if (isPrim(i)) {
sum.add(BigInteger.valueOf(i));
}
}
Переменная суммы всегда равна 0. Что я делаю не так?
У меня есть код, который не работает:
BigInteger sum = BigInteger.valueOf(0);
for(int i = 2; i < 5000; i++) {
if (isPrim(i)) {
sum.add(BigInteger.valueOf(i));
}
}
Переменная суммы всегда равна 0. Что я делаю не так?
BigInteger
неизменен. В javadocs указано, что add () "[r] возвращает BigInteger, значение которого равно (this + val)." Следовательно, вы не можете изменить sum
, вам нужно переназначить результат метода add
переменной sum
.
sum = sum.add(BigInteger.valueOf(i));
sum = sum.add(BigInteger.valueOf(i))
Класс BigInteger
неизменен, поэтому вы не можете изменить его состояние. Таким образом, вызов «добавить» создает новый BigInteger
, а не изменяет текущий.
Другие ответы подтвердили это; BigInteger неизменен. Вот небольшое изменение, чтобы этот код заработал.
BigInteger sum = BigInteger.valueOf(0);
for(int i = 2; i < 5000; i++) {
if (isPrim(i)) {
sum = sum.add(BigInteger.valueOf(i));
}
}
BigInteger - неизменяемый класс. Поэтому всякий раз, когда вы выполняете какие-либо арифметические операции, вы должны переназначить вывод переменной.
java.math.BigInteger
- это неизменяемый класс, поэтому мы не можем назначить новый объект на место уже назначенного объекта. Но вы можете создать новый объект для присвоения нового значения, например:
sum = sum.add(BigInteger.valueOf(i));
Да, это неизменный
sum.add(BigInteger.valueOf(i));
поэтому метод add () класса BigInteger не добавляет новое значение BigIntger к своему собственному значению, а создает и возвращает новую ссылку BigInteger без изменения текущего BigInteger и это то, что делается даже в случай со строками
На самом деле вы можете использовать,
BigInteger sum= new BigInteger("12345");
для создания объекта для класса BigInteger. Но проблема здесь в том, что вы не можете указать переменную в двойных кавычках, поэтому мы должны использовать метод valueOf (), и мы должны сохранить ответ в этой сумме снова. Итак, мы напишем,
sum= sum.add(BigInteger.valueOf(i));
Biginteger
- неизменяемый класс. Вам нужно явно назначить значение вашего вывода для такой суммы:
sum = sum.add(BigInteger.valueof(i));
Поскольку вы суммируете некоторые значения int вместе, нет необходимости использовать BigInteger. long
для этого достаточно. int
- 32 бита, а long
- 64 бита, которые могут содержать сумму всех значений типа int.
int
, так чтоBigInteger
для этого примера вам не понадобится. - person notnoop   schedule 23.11.2009