web-dev-qa-db-ja.com

BigIntegerの使い方は?

私はこのコードを持っていますが、これはうまくいきません。

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

合計変数は常に0です。何が間違っていますか。

147
cc.

BigIntegerは不変です。 Javadocは、 add() "[r]は(this + val)の値を持つBigIntegerを返します"と述べています。したがって、sumを変更することはできません。addメソッドの結果をsum変数に再割り当てする必要があります。

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

BigIntegerクラスは不変なので、その状態を変更することはできません。そのため、 "add"を呼び出すと、現在の値を変更するのではなく、新しいBigIntegerが作成されます。

57
Bozho

他の回答はそれを釘付けにしました。 BigIntegerは不変です。そのコードを機能させるための小さな変更があります。

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

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

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

BigIntegerは不変クラスです。そのため、算術演算を行うときはいつでも、出力を変数に割り当て直す必要があります。

10
Poindexter

はい、不変です

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

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

3
murali krish

実際に使えます、

BigInteger sum= new BigInteger("12345");

bigIntegerクラスのオブジェクトを作成するためのものです。ただし、ここでの問題は、二重引用符で変数を指定できないことです。したがって、valueOf()メソッドを使用し、その合計に答えを格納する必要があります。もう一度書きます。

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

Bigintegerは不変クラスです。このように、あなたの出力の値をsumに明示的に代入する必要があります。

sum = sum.add(BigInteger.valueof(i));    
0
Arpna Joshi