Bagaimana cara menggunakan BigInteger?

153

Saya memiliki kode ini, yang tidak berfungsi:

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

Variabel penjumlahan selalu 0. Apa yang saya lakukan salah?

cc
sumber
Ngomong-ngomong, penjumlahannya harus sesuai int, jadi Anda tidak perlu BigIntegeruntuk contoh ini.
notnoop
8
Tidak, saya mengubah kode. Jumlahnya lebih besar dari 5000.
cc.
Pertanyaan yang ditautkan sebagai duplikat tampaknya tidak memiliki masalah yang sama dengan pertanyaan ini (pertanyaan yang ditautkan adalah tentang fungsi mana yang harus digunakan sehingga BigInteger dapat ditambahkan, yang ini adalah tentang bagaimana menggunakan fungsi add)
justhalf

Jawaban:

203

BigIntegertidak kekal. Javadocs menyatakan bahwa add () "[r] membuat BigInteger yang nilainya (this + val)." Oleh karena itu, Anda tidak dapat mengubah sum, Anda perlu menetapkan kembali hasil addmetode ke sumvariabel.

sum = sum.add(BigInteger.valueOf(i));
MarkPowell
sumber
1
int akan cukup selama Anda tidak melampaui 2 ^ 31-1, lama akan cukup selama Anda tidak pergi lebih dari 2 ^ 63-1.
Jean Hominal
2
Yang, dalam contohnya, dia tidak akan melakukannya.
MarkPowell
105
Tetapi apakah ini benar-benar sulit untuk dipikirkan, mungkin ia menyederhanakan contohnya hingga apa masalahnya?
thecoshman
@thecoshman - Anda benar dan jumlah upvotes pada komentar Anda menunjukkan ini adalah saran bijak untuk semua pembaca pertanyaan seperti itu. Beberapa saran yang lebih bijak adalah " baca apa yang ditulis orang lain sebelum menjawab atau berkomentar. " Misalnya dalam kasus ini bahkan tidak memerlukan APA PUN karena OP jelas menyatakan bahwa dia melakukan hal itu dalam komentar di bawah Pertanyaan: " Tidak, saya mengubah kodenya. Jumlahnya lebih besar dari 5000. "
OMY
58
sum = sum.add(BigInteger.valueOf(i))

The BigIntegerkelas adalah kekal, maka Anda tidak dapat mengubah keadaan. Jadi panggilan "tambah" menciptakan yang baru BigInteger, daripada mengubah arus.

Bozho
sumber
22

Balasan lain telah berhasil melakukannya; BigInteger tidak bisa diubah. Inilah perubahan kecil untuk membuat kode itu berfungsi.

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

BigInteger adalah kelas yang tidak dapat diubah. Jadi, setiap kali Anda melakukan aritmatika, Anda harus menetapkan kembali output ke variabel.

Poindexter
sumber
11

java.math.BigIntegeradalah kelas yang tidak dapat diubah sehingga kita tidak dapat menetapkan objek baru di lokasi objek yang sudah ditetapkan. Tetapi Anda dapat membuat objek baru untuk menetapkan nilai baru seperti:

sum = sum.add(BigInteger.valueOf(i));
Arvind
sumber
3

Ya itu tidak berubah

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

jadi metode add () dari kelas BigInteger tidak menambahkan nilai BigIntger baru ke nilainya sendiri, tetapi membuat dan mengembalikan referensi BigInteger baru tanpa mengubah BigInteger saat ini dan inilah yang dilakukan bahkan dalam kasus Strings

murali krish
sumber
0

Sebenarnya kamu bisa menggunakan,

BigInteger sum= new BigInteger("12345");

untuk membuat objek untuk kelas BigInteger.Tapi masalahnya di sini adalah, Anda tidak dapat memberikan variabel dalam tanda kutip ganda. Jadi kita harus menggunakan metode valueOf () dan kita harus menyimpan jawabannya dalam jumlah itu lagi. Jadi kita akan menulis,

sum= sum.add(BigInteger.valueOf(i));
Harry
sumber
0

Bigintegeradalah kelas yang tidak berubah. Anda harus secara eksplisit menetapkan nilai output Anda ke jumlah seperti ini:

sum = sum.add(BigInteger.valueof(i));    
Arpna Joshi
sumber
4
Ini sekarang jawaban ke-8 dengan penjelasan yang sama, jadi bagaimana jawaban ini membantu?
Tom
-6

Karena Anda menjumlahkan beberapa nilai int bersama, tidak perlu menggunakan BigInteger. longsudah cukup untuk itu. intadalah 32 bit, sedangkan long64 bit, yang dapat berisi jumlah semua nilai int.

frank.liu
sumber
"Tapi apakah itu benar-benar sulit untuk dipikirkan, mungkin dia menyederhanakan contohnya hingga apa masalahnya?" (Mengutip ucapan)
Bulwersator
5
Untuk pertanyaan ini, jawaban saya adalah sedikit ruang lingkup kami. Karena topik fokus pada bagaimana menggunakan BigInteger. Hanya satu dari pengalaman pribadi saya, jika kita ingin merangkum beberapa bilangan bulat dan jumlahnya tidak cukup besar, saya lebih suka lama. Karena itu mudah digunakan dan berjalan lebih cepat. Untuk input skala besar, BigInteger adalah pilihan yang baik.
frank.liu