Вопрос:

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

java biginteger

329570 просмотра

9 ответа

2667 Репутация автора

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

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

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

Автор: cc. Источник Размещён: 23.11.2009 03:37

Ответы (9)


57 плюса

509665 Репутация автора

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

BigIntegerКласс является неизменным, следовательно , вы не можете изменить свое состояние. Поэтому вызов «add» создает новый BigInteger, а не модифицирует текущий.

Автор: Bozho Размещён: 23.11.2009 03:38

200 плюса

14521 Репутация автора

Решение

BigIntegerнеизменен. Javadocs утверждает, что add () «[r] переворачивает BigInteger, значение которого (this + val)». Следовательно, вы не можете изменить sum, вам нужно переназначить результат addметода на sumпеременную.

sum = sum.add(BigInteger.valueOf(i));
Автор: MarkPowell Размещён: 23.11.2009 03:38

10 плюса

2242 Репутация автора

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

Автор: Poindexter Размещён: 23.11.2009 03:39

21 плюса

22588 Репутация автора

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

BigInteger sum = BigInteger.valueOf(0);
for(int i = 2; i < 5000; i++) {
    if (isPrim(i)) {
        sum = sum.add(BigInteger.valueOf(i));
    }
}
Автор: Dean J Размещён: 23.11.2009 04:43

11 плюса

1300 Репутация автора

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

sum = sum.add(BigInteger.valueOf(i));
Автор: Arvind Размещён: 25.04.2013 03:16

-6 плюса

139 Репутация автора

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

Автор: frank.liu Размещён: 07.09.2013 02:07

3 плюса

757 Репутация автора

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

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

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

Автор: murali krish Размещён: 16.06.2015 12:50

0 плюса

25 Репутация автора

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

BigInteger sum= new BigInteger("12345");

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

sum= sum.add(BigInteger.valueOf(i));
Автор: harry Размещён: 01.10.2015 05:21

0 плюса

27 Репутация автора

Bigintegerнеизменный класс. Вам необходимо явно присвоить значение вашего вывода сумме следующим образом:

sum = sum.add(BigInteger.valueof(i));    
Автор: Arpna Joshi Размещён: 09.10.2016 03:50
Вопросы из категории :
32x32