154

我有这段代码,它不起作用:

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

sum 变量始终为 0。我做错了什么?

4

9 回答 9

207

BigInteger是不可变的。javadocs 声明add() “[r] 返回一个 BigInteger,其值为 (this + val)。” 因此,您无法更改sum,您需要将add方法的结果重新分配给sum变量。

sum = sum.add(BigInteger.valueOf(i));
于 2009-11-23T15:38:42.757 回答
58
sum = sum.add(BigInteger.valueOf(i))

该类BigInteger是不可变的,因此您无法更改其状态。所以调用“add”会创建一个新的BigInteger,而不是修改当前的。

于 2009-11-23T15:38:22.553 回答
22

其他答复已经确定了;BigInteger 是不可变的。这是使该代码正常工作的小改动。

BigInteger sum = BigInteger.valueOf(0);
for(int i = 2; i < 5000; i++) {
    if (isPrim(i)) {
        sum = sum.add(BigInteger.valueOf(i));
    }
}
于 2009-11-23T16:43:08.727 回答
11

BigInteger 是一个不可变的类。因此,无论何时进行任何算术运算,都必须将输出重新分配给变量。

于 2009-11-23T15:39:44.580 回答
11

java.math.BigInteger是一个不可变的类,所以我们不能在已分配对象的位置分配新对象。但是您可以创建新对象来分配新值,例如:

sum = sum.add(BigInteger.valueOf(i));
于 2013-04-25T15:16:55.587 回答
3

是的,它是不可变的

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

所以 BigInteger 类的方法 add() 不会将新的 BigIntger 值添加到它自己的值中,而是在不更改当前 BigInteger的情况下创建并返回一个新的 BigInteger 引用,即使在 Strings 的情况下也是如此

于 2015-06-16T12:50:44.673 回答
0

其实可以用

BigInteger sum= new BigInteger("12345");

用于为 BigInteger 类创建对象。但这里的问题是,你不能在双引号中给出变量。所以我们必须使用valueOf()方法,我们必须再次将答案存储在该总和中。所以我们会写,

sum= sum.add(BigInteger.valueOf(i));
于 2015-10-01T17:21:50.837 回答
0

Biginteger是一个不可变的类。您需要明确地将输出的值分配给总和,如下所示:

sum = sum.add(BigInteger.valueof(i));    
于 2016-10-09T03:50:22.287 回答
-6

由于您将一些 int 值汇总在一起,因此无需使用 BigInteger。long就足够了。int是 32 位,而long是 64 位,可以包含所有 int 值的总和。

于 2013-09-07T02:07:38.917 回答