У мене є цей фрагмент коду, який не працює:
BigInteger sum = BigInteger.valueOf(0);
for(int i = 2; i < 5000; i++) {
if (isPrim(i)) {
sum.add(BigInteger.valueOf(i));
}
}
Змінна суми завжди 0. Що я роблю неправильно?
У мене є цей фрагмент коду, який не працює:
BigInteger sum = BigInteger.valueOf(0);
for(int i = 2; i < 5000; i++) {
if (isPrim(i)) {
sum.add(BigInteger.valueOf(i));
}
}
Змінна суми завжди 0. Що я роблю неправильно?
Відповіді:
BigIntegerнезмінна. Javadocs зазначає, що додає () "[r] записує BigInteger, значення якого (це + val)." Отже, ви не можете змінити sum, вам потрібно переназначити результат addметоду на sumзмінну.
sum = sum.add(BigInteger.valueOf(i));
BigInteger - клас незмінний. Тому щоразу, коли ви робите будь-яку арифметику, вам доведеться перепризначити вихідну змінну.
Так, це незмінне
sum.add(BigInteger.valueOf(i));
тому метод add () класу BigInteger не додає нового значення BigIntger до власного значення, а створює та повертає нову посилання BigInteger, не змінюючи поточний BigInteger, і це робиться навіть у випадку Strings
Насправді ви можете використовувати,
BigInteger sum= new BigInteger("12345");
для створення об’єкта для класу BigInteger. Але тут проблема полягає в тому, що ви не можете дати змінну в подвійних лапках. Отже, ми повинні використовувати метод valueOf (), і нам доведеться знову зберігати відповідь у цій сумі. Тому ми напишемо,
sum= sum.add(BigInteger.valueOf(i));
Bigintegerє незмінним класом. Вам потрібно чітко призначити значення результату, щоб підсумувати його так:
sum = sum.add(BigInteger.valueof(i));
Оскільки ви підсумовуєте деякі значення int разом, не потрібно використовувати BigInteger. longдля цього достатньо. intстановить 32 біти, тоді longяк 64 біт, який може містити суму всіх значень int.
int, тому вам не потрібноBigIntegerв цьому прикладі.