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]値が (this + val) である BigInteger を返す」と記載されています。したがって、変更することはできません。メソッドの結果を変数sumに再割り当てする必要があります。addsum

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

クラスは不変であるため、BigIntegerその状態を変更することはできません。したがって、「追加」を呼び出すと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

java.math.BigInteger不変クラスであるため、既に割り当てられているオブジェクトの場所に新しいオブジェクトを割り当てることはできません。ただし、新しいオブジェクトを作成して、次のような新しい値を割り当てることができます。

sum = sum.add(BigInteger.valueOf(i));
于 2013-04-25T15:16:55.587 に答える
11

BigInteger は不変クラスです。したがって、演算を行うときはいつでも、出力を変数に再割り当てする必要があります。

于 2009-11-23T15:39:44.580 に答える
3

はい、不変です

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

そのため、BigInteger クラスのメソッド add() は、新しい BigIntger 値をそれ自身の値に追加しませんが、現在の BigInteger を変更せずに新しい BigInteger 参照を作成して返します。これは、文字列の場合でも行われることです。

于 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 に答える
-6

いくつかの int 値を合計しているので、BigInteger を使用する必要はありません。longそれで十分です。intは 32 ビットですが、longは 64 ビットで、すべての int 値の合計を含めることができます。

于 2013-09-07T02:07:38.917 に答える