Mam ten fragment kodu, który nie działa:
BigInteger sum = BigInteger.valueOf(0);
for(int i = 2; i < 5000; i++) {
if (isPrim(i)) {
sum.add(BigInteger.valueOf(i));
}
}
Zmienna sumująca zawsze wynosi 0. Co robię źle?
Mam ten fragment kodu, który nie działa:
BigInteger sum = BigInteger.valueOf(0);
for(int i = 2; i < 5000; i++) {
if (isPrim(i)) {
sum.add(BigInteger.valueOf(i));
}
}
Zmienna sumująca zawsze wynosi 0. Co robię źle?
Odpowiedzi:
BigInteger
jest niezmienna. Element javadocs stwierdza, że add () „[r] et zwraca BigInteger, którego wartość to (this + val)”. Dlatego nie możesz zmienić sum
, musisz ponownie przypisać wynik add
metody do sum
zmiennej.
sum = sum.add(BigInteger.valueOf(i));
BigInteger to niezmienna klasa. Więc za każdym razem, gdy wykonujesz jakąkolwiek arytmetykę, musisz ponownie przypisać wynik do zmiennej.
Tak, jest niezmienny
sum.add(BigInteger.valueOf(i));
więc metoda add () klasy BigInteger nie dodaje nowej wartości BigIntger do swojej własnej wartości, ale tworzy i zwraca nową referencję BigInteger bez zmiany obecnego BigInteger i tak jest nawet w przypadku Strings
Właściwie możesz użyć,
BigInteger sum= new BigInteger("12345");
do stworzenia obiektu dla klasy BigInteger, ale problem polega na tym, że nie możesz podać zmiennej w podwójnych cudzysłowach, więc musimy użyć metody valueOf () i musimy ponownie zapisać odpowiedź w tej sumie.
sum= sum.add(BigInteger.valueOf(i));
Biginteger
jest niezmienną klasą. Musisz jawnie przypisać wartość swojego wyniku do sumy w następujący sposób:
sum = sum.add(BigInteger.valueof(i));
Ponieważ sumujesz razem niektóre wartości int, nie ma potrzeby używania BigInteger. long
wystarczy do tego. int
to 32 bity, a long
64 bity, które mogą zawierać sumę wszystkich wartości int.
int
, więc nie potrzebujeszBigInteger
tego przykładu.