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 2009年

8
いいえ、コードを変更しました。数は5000よりも大きい
CC。

重複としてリンク質問はこの質問と同じ問題を抱えているようには見えない(リンク質問があるについているのBigIntegerを追加することができるので、使用する機能、これは約あるの追加機能を使用する)
justhalf

回答:


203

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

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

1
2 ^ 31-1を超えない限りintで十分ですが、2 ^ 63-1を超えない限りlongで十分です。
Jean Hominal 2009年

2
彼の例では、そうしません。
MarkPowell 2009年

105
しかし、おそらく彼が例を単純化して問題が何であるかを正確に理解するのは本当に難しいですか?
thecoshman 2013

@thecoshman-あなたは全く正しいです、そしてあなたのコメントに対する賛成票の数はこれがそのような質問のすべての読者への賢明なアドバイスであることを示しています。いくつかのより賢明なアドバイスは「他の人が答えるか、コメントの前に書いたものを読んで。」それも必要ありません。この場合、例えば、ANY OPは明らかに彼がしたことを述べたので、考えをちょうどその質問以下のコメントで:「いや、Iコードを変更しました。番号は5000を超えています。 "
OMY

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

BigIntegerクラスは不変である、それゆえあなたがその状態を変更することはできません。したがって、「追加」を呼び出すと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参照作成して返します。これ文字列の場合でも行われることです


0

実際に使用できます

BigInteger sum= new BigInteger("12345");

BigIntegerクラスのオブジェクトを作成するためです。ただし、ここでの問題は、二重引用符で変数を指定できないことです。そのため、valueOf()メソッドを使用する必要があり、その合計に回答を保存する必要があります。

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

0

Biginteger不変クラスです。次のように合計するには、出力の値を明示的に割り当てる必要があります。

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

4
これが同じ説明の8番目の回答です。この回答はどのように役立ちますか?
トム

-6

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


「しかし、彼が例を単純化して問題が何であるかを正確に理解するのは本当に難しいですか?」(thecoshmanを引用)
Bulwersator 2014年

5
この質問については、私の答えは少し私たちの範囲です。トピックはBigIntegerの使用方法に焦点を当てているため。私の個人的な経験の1つにすぎませんが、整数を合計したいが、数値がそれほど大きくない場合は、長い方がいいと思います。それは使いやすく、実行速度が速いためです。大規模な入力の場合、BigIntegerが適しています。
frank.liu 2014年
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.