BigInteger nasıl kullanılır?


153

Ben çalışmıyor bu kod parçası var:

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

Toplam değişken her zaman 0'dır. Neyi yanlış yapıyorum?


Bu arada, toplam kolayca kolayca sığmalıdır int, bu nedenle BigIntegerbu örneğe ihtiyacınız yoktur .
notnoop

8
Hayır, kodu değiştirdim. Sayı 5000'den büyük
.

Yinelenen olarak bağlanan soru, bu soru ile aynı soruna sahip gibi görünmüyor (bağlantılı soru, böylece BigInteger'in hangi fonksiyonun kullanılacağı hakkında, bu bir add fonksiyonunun nasıl kullanılacağı ile ilgilidir)
sadece

Yanıtlar:


203

BigIntegerdeğişmez. Javadocs, add () "[r] 'nin değeri (bu + val) olan bir BigInteger verdiğini belirtir. Bu nedenle, değiştiremezsiniz sum, addyöntemin sonucunu sumdeğişkene yeniden atamanız gerekir .

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

1
int, 2 ^ 31-1'i geçmediğiniz sürece yeterli olacaktır, 2 ^ 63-1'i geçmediğiniz sürece uzun yeterli olacaktır.
Jean Hominal

2
Hangi, onun örneğinde, olmayacak.
MarkPowell

105
Ama belki de örneğini sorunun tam olarak ne olduğunu basitleştirdiğini düşünmek gerçekten zor mu?
thecoshman

@thecoshman - Oldukça haklısınız ve yorumunuzdaki upvotes sayısı, bu tür soruların tüm okuyucuları için akıllıca bir tavsiye olduğunu gösteriyor. Biraz daha akıllıca bir tavsiye, " cevaplamadan veya yorum yapmadan önce başkalarının yazdıklarını okumaktır. " Örneğin, bu durumda OP herhangi bir düşünce gerektirmez, çünkü OP, Sorunun altındaki yorumlarda şunu yaptığını açıkça belirtti: " Hayır, ben kodu 5000'den büyük. "
OMY

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

BigIntegerSınıf dolayısıyla onun durumunu değiştiremez, sabittir. Bu nedenle "add" çağrısı BigInteger, akımı değiştirmek yerine yeni bir dosya oluşturur .


22

Diğer cevaplar çivilenmiş; BigInteger değişmez. İşte bu kodun çalışması için küçük değişiklik.

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

11

BigInteger değişmez bir sınıftır. Bu nedenle, herhangi bir aritmetik işlem yaptığınızda, çıktıyı bir değişkene yeniden atamanız gerekir.


11

java.math.BigIntegerBir olan değişmez zaten atanmış nesnenin konumda yeni bir nesne atanamıyor böylece sınıfı. Ancak, aşağıdaki gibi yeni bir değer atamak için yeni nesne oluşturabilirsiniz:

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

3

Evet bu değişmez

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

BigInteger sınıfının add () yöntemi kendi değerine yeni BigIntger değeri eklemez, ancak geçerli BigInteger'i değiştirmeden yeni bir BigInteger başvurusu oluşturur ve döndürür ve bu, Dizeler durumunda bile yapılır


0

Aslında kullanabilirsiniz,

BigInteger sum= new BigInteger("12345");

BigInteger sınıfı için nesne oluşturmak için.Ancak burada sorun, çift tırnak içine bir değişken veremezsiniz. Bu yüzden valueOf () yöntemini kullanmamız gerekir ve cevabı tekrar bu toplamda saklamamız gerekir.

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

0

Bigintegerdeğişmez bir sınıftır. Çıktınızın değerini şu şekilde toplamak için açıkça atamanız gerekir:

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

4
Bu şimdi aynı açıklama ile 8. cevap, bu yüzden bu cevap nasıl yardımcı olur?
Tom

-6

Bazı int değerlerini bir araya getirdiğiniz için BigInteger kullanmaya gerek yoktur. longbunun için yeterlidir. int32 bit, long64 bit ise tüm int değerlerinin toplamını içerebilir.


"Ama düşünmek gerçekten o kadar zor olabilir belki de örneğini sorunun tam olarak ne olduğunu basitleştirdi?" (thecoshman'dan alıntı)
Bulwersator

5
Bu soruya cevabım biraz kapsamımız. Konu BigInteger'in nasıl kullanılacağına odaklandığından. Kişisel deneyimlerimden sadece biri, eğer bazı tamsayıları özetlemek istiyorsak ve sayılar oldukça büyük değilse, uzun tercih ederim. Çünkü bu kullanımı kolaydır ve daha hızlı çalışır. Büyük ölçekli giriş için BigInteger iyi bir seçimdir.
frank.liu
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.