2009-11-23 64 views
136

我有這樣的一段代碼,這是行不通的:Java:如何使用BigInteger?

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

總和變量始終是0。我在做什麼錯?

+0

順便說一句,總和應該很容易適應'int',所以你不需要'BigInteger'這個例子。 – notnoop 2009-11-23 15:51:26

+5

不,我改變了代碼。該數字大於5000。 – 2009-11-23 19:40:22

+0

鏈接爲重複的問題似乎沒有與此問題相同的問題(鏈接的問題是關於*哪些*函數使用BigInteger可以添加,這一個是關於*如何*使用添加功能) – justhalf 2015-12-23 14:04:36

回答

176

BigInteger是不可變的。 javadocs指出add()「[r]產生了一個BigInteger,其值是(this + val)。」因此,您不能更改sum,您需要將add方法的結果重新分配給sum變量。

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

int只要你不超過2^31-1就足夠了,只要你不超過2^63-1就足夠長。 – 2009-11-23 16:45:53

+2

在他的例子中,他不會。 – MarkPowell 2009-11-23 16:46:54

+97

但是,真的很難想象他或許簡化了他的例子到問題是什麼? – thecoshman 2013-07-24 10:46:03

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

BigInteger類是不可變的,因此您無法更改其狀態。所以調用「add」會創建一個新的BigInteger,而不是修改當前值。

10

BigInteger是一個不可變的類。所以每當你做任何算術時,你都必須重新分配輸出到一個變量。

20

其他回覆已將它釘死; BigInteger是不可變的。這是對代碼起作用的小改動。

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

java.math.BigInteger不變類,所以我們不能在已分配對象的位置分配新對象。但是你可以創建新的對象來分配如新價值:

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

既然你一些INT值相加在一起,就沒有必要使用的BigInteger。 long就足夠了。 int是32位,而long是64位,它可以包含所有int值的總和。

+0

「但是真的很難想象他是否簡化了他的例子到問題是什麼?」 (引用科斯曼) – Bulwersator 2014-01-03 07:22:48

+2

對於這個問題,我的答案有點像我們的範圍。由於該主題關注如何使用BigInteger。只是我個人的經驗之一,如果我們想總結一些整數並且數字不是很大,我會更喜歡長。因爲這很容易使用,運行速度更快。對於大規模投入,BigInteger是不錯的選擇。 – 2014-01-07 06:33:21

3

是的,它是不可變的

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

所以這種方法添加的BigInteger類的()不增加新的BigIntger價值,其自身的價值,但不改變當前的BigInteger創建並返回一個新的BigInteger參考這是即使在字符串的情況下

0

其實你可以用什麼做,

BigInteger sum= new BigInteger("12345"); 

用於爲BigInteger類創建對象。但問題在於,您無法在雙引號中給出變量。因此,我們必須使用valueOf()方法,並且我們必須再次將該答案存儲在該總和中。所以我們會寫:

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

Biginteger是一個不可變的類。 你需要明確指定你的輸出值來概括這樣的:

sum = sum.add(BigInteger.valueof(i));  
+4

這是現在第8個答案,解釋相同,所以這個答案有幫助嗎? – Tom 2016-10-09 03:57:37