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?
java
biginteger
cc.
źródło
źródło
int
, więc nie potrzebujeszBigInteger
tego przykładu.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ć wynikadd
metody dosum
zmiennej.źródło
BigInteger
Klasa jest niezmienna, a więc nie można zmienić jego stan. Więc wywołanie „add” tworzy nowyBigInteger
, zamiast modyfikować bieżący.źródło
Inne odpowiedzi potwierdziły to; BigInteger jest niezmienny. Oto drobna zmiana, aby kod działał.
źródło
BigInteger to niezmienna klasa. Więc za każdym razem, gdy wykonujesz jakąkolwiek arytmetykę, musisz ponownie przypisać wynik do zmiennej.
źródło
java.math.BigInteger
jest niezmienną klasą, więc nie możemy przypisać nowego obiektu w lokalizacji już przypisanego obiektu. Ale możesz utworzyć nowy obiekt, aby przypisać nową wartość, na przykład:źródło
Tak, jest niezmienny
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
źródło
Właściwie możesz użyć,
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.
źródło
Biginteger
jest niezmienną klasą. Musisz jawnie przypisać wartość swojego wyniku do sumy w następujący sposób:źródło
Ponieważ sumujesz razem niektóre wartości int, nie ma potrzeby używania BigInteger.
long
wystarczy do tego.int
to 32 bity, along
64 bity, które mogą zawierać sumę wszystkich wartości int.źródło