Java: Как использовать BigInteger?
У меня есть эта часть кода, которая не работает:
BigInteger sum = BigInteger.valueOf(0);
for(int i = 2; i < 5000; i++) {
if (isPrim(i)) {
sum.add(BigInteger.valueOf(i));
}
}
Переменная суммы всегда равна 0. Что я делаю неправильно?
Ответы
Ответ 1
BigInteger
является неизменным. В javadocs указано, что добавить() "[r] eturns BigInteger, чье значение (this + val)." Поэтому вы не можете изменить sum
, вам нужно переназначить результат метода add
на переменную sum
.
sum = sum.add(BigInteger.valueOf(i));
Ответ 2
sum = sum.add(BigInteger.valueOf(i))
Класс BigInteger
неизменен, поэтому вы не можете изменить его состояние. Поэтому вызов "add" создает новый BigInteger
, вместо того, чтобы изменять текущий.
Ответ 3
Другие ответы прибили его; BigInteger неизменен. Здесь небольшое изменение для работы этого кода.
BigInteger sum = BigInteger.valueOf(0);
for(int i = 2; i < 5000; i++) {
if (isPrim(i)) {
sum = sum.add(BigInteger.valueOf(i));
}
}
Ответ 4
java.math.BigInteger
- неизменный класс, поэтому мы не можем назначить новый объект в местоположении уже назначенного объекта. Но вы можете создать новый объект для назначения нового значения, например:
sum = sum.add(BigInteger.valueOf(i));
Ответ 5
BigInteger - неизменный класс. Поэтому всякий раз, когда вы выполняете какую-либо арифметику, вы должны переназначить вывод переменной.
Ответ 6
Да, он непреложный
sum.add(BigInteger.valueOf(i));
поэтому метод add() класса BigInteger не добавляет новое значение BigIntger к своему собственному значению, но создает и возвращает новую ссылку BigInteger без изменения текущего BigInteger и , это то, что сделано даже в случае строк
Ответ 7
Biginteger
- непреложный класс.
Вам нужно явно назначить значение вашего вывода таким образом:
sum = sum.add(BigInteger.valueof(i));
Ответ 8
На самом деле вы можете использовать
BigInteger sum= new BigInteger("12345");
для создания объекта для класса BigInteger. Но проблема в том, что вы не можете дать переменную в двойных кавычках. Поэтому нам нужно использовать метод valueOf(), и мы должны сохранить ответ в этой сумме снова. Так мы будем писать,
sum= sum.add(BigInteger.valueOf(i));
Ответ 9
Поскольку вы суммируете некоторые значения int вместе, нет необходимости использовать BigInteger. long
для этого достаточно. int
- 32 бита, а long
- 64 бита, который может содержать сумму всех значений int.