如何使用BigInteger?


153

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

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

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


顺便说一句,总和应该很容易地适合int,所以您不需要BigInteger此示例。
notnoop

8
不,我更改了代码。的数量大于5000更大
立方厘米。

链接为重复项的问题似乎与此问题没有相同的问题(链接的问题是关于使用哪个函数,以便可以添加BigInteger,这是有关如何使用add函数的问题)
justhalf 2015年

Answers:


203

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

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

1
只要您不超过2 ^ 31-1,int就足够了,只要您不超过2 ^ 63-1就足够了。
让·霍米纳尔

2
在他的例子中,他不会。
MarkPowell

105
但是,是否真的很难想到也许他将自己的例子简化为确切的问题所在?
thecoshman 2013年

@thecoshman-您是非常正确的,您的评论中的投票数量表明,这对于所有此类问题的读者都是明智的建议。一些更明智的建议是“ 读什么人回答或评论之前写的。 ”例如,在这种情况下,它甚至不需要任何的思想,因为运算明确表示,他所做的只是在问题下面的评论:“ 不,我更改了代码。该数字大于5000。
OMY

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

BigInteger班是不可改变的,因此你不能改变其状态。因此,调用“ add”会创建一个new BigInteger,而不是修改当前值。


22

其他答复都把它钉了。BigInteger是不可变的。这是使代码正常工作的微小更改。

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

11

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


11

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

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

3

是的,它是不可变的

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

因此BigInteger类的方法add()不会将新的BigIntger值添加到其自己的值中,而是不更改当前BigInteger 的情况下创建并返回了一个新的BigInteger引用即使在使用String的情况下也可以做到这一点


0

其实你可以用

BigInteger sum= new BigInteger("12345");

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

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


-6

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


“但是真的很难想到也许他将自己的榜样简化为问题所在吗?” (引用thecoshman)
Bulwersator 2014年

5
对于这个问题,我的回答有点我们的范围。由于该主题着重于如何使用BigInteger。仅作为我的个人经验之一,如果我们想对一些整数求和,而这些数字不是很大,我宁愿使用长整数。因为它易于使用且运行速度更快。对于大规模输入,BigInteger是不错的选择。
frank.liu 2014年
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.