私はこのコードを持っていますが、動作していません:
BigInteger sum = BigInteger.valueOf(0);
for(int i = 2; i < 5000; i++) {
if (isPrim(i)) {
sum.add(BigInteger.valueOf(i));
}
}
sum 変数は常に 0 です。何が間違っていますか?
私はこのコードを持っていますが、動作していません:
BigInteger sum = BigInteger.valueOf(0);
for(int i = 2; i < 5000; i++) {
if (isPrim(i)) {
sum.add(BigInteger.valueOf(i));
}
}
sum 変数は常に 0 です。何が間違っていますか?
BigInteger
不変です。javadocs には、add()は「[r]値が (this + val) である BigInteger を返す」と記載されています。したがって、変更することはできません。メソッドの結果を変数sum
に再割り当てする必要があります。add
sum
sum = sum.add(BigInteger.valueOf(i));
sum = sum.add(BigInteger.valueOf(i))
クラスは不変であるため、BigInteger
その状態を変更することはできません。したがって、「追加」を呼び出すとBigInteger
、現在の を変更するのではなく、新しい が作成されます。
他の回答はそれを釘付けにしました。BigInteger は不変です。そのコードを機能させるための小さな変更を次に示します。
BigInteger sum = BigInteger.valueOf(0);
for(int i = 2; i < 5000; i++) {
if (isPrim(i)) {
sum = sum.add(BigInteger.valueOf(i));
}
}
java.math.BigInteger
は不変クラスであるため、既に割り当てられているオブジェクトの場所に新しいオブジェクトを割り当てることはできません。ただし、新しいオブジェクトを作成して、次のような新しい値を割り当てることができます。
sum = sum.add(BigInteger.valueOf(i));
BigInteger は不変クラスです。したがって、演算を行うときはいつでも、出力を変数に再割り当てする必要があります。
はい、不変です
sum.add(BigInteger.valueOf(i));
そのため、BigInteger クラスのメソッド add() は、新しい BigIntger 値をそれ自身の値に追加しませんが、現在の BigInteger を変更せずに新しい BigInteger 参照を作成して返します。これは、文字列の場合でも行われることです。
実際に使えますが、
BigInteger sum= new BigInteger("12345");
BigInteger クラスのオブジェクトを作成します。しかし、ここでの問題は、二重引用符で変数を指定できないことです。したがって、valueOf()メソッドを使用する必要があり、その合計に回答を再度格納する必要があります。したがって、次のように記述します。
sum= sum.add(BigInteger.valueOf(i));
いくつかの int 値を合計しているので、BigInteger を使用する必要はありません。long
それで十分です。int
は 32 ビットですが、long
は 64 ビットで、すべての int 値の合計を含めることができます。