Я некоторое время работал над этой проблемой и был уверен, что мой метод сработает. Я получил свой текущий ответ 4190404 с двумя разными способами нахождения суммы. В числе 21 (дружные числа) я использовал тот же алгоритм для суммирования делителей числа, что убедило меня, что оно работает правильно. Я посмотрел на блоги для руководства, но я никуда не деться. Если кто-то может указать мне правильное направление, я был бы чрезвычайно благодарен.
import java.util.ArrayList;
public class problem23 {
public static void main(String[] args) {
int upperLimit = 28123;
long sum = 0;
Список для хранения всех чисел под моим верхним пределом
ArrayList<Long> abunNums = new ArrayList<Long>();
abunNums.add((long) 0);
for (long i = 1; i <= upperLimit; i++)
if (isAbundant(i))
abunNums.add(i);
логический массив. Значение true индекса равно сумме двух чисел, а если нет - 1007 *
boolean[] isSumOfAbun = new boolean[upperLimit+1];
int j = 0;
for (int i = 1; i < abunNums.size(); i++) {
j = i;
while (abunNums.get(i) + abunNums.get(j) <= upperLimit) {
isSumOfAbun[(int) (abunNums.get(i) + abunNums.get(j))] = true;
j++;
}
}
// цикл по логическому массиву и и индекс к сумме, если число // не может быть описано как сумма двух чисел с большим числом
for (int i = 1; i <= upperLimit; i++)
if (!isSumOfAbun[i]) {
sum += i;
System.out.println(i);
}
System.out.println(sum);
}
метод, чтобы проверить, является ли число обильным
public static boolean isAbundant(long n) {
long val = 1;
for (int i = 2; i*i < n; i++)
if (n % i == 0) {
if (i == n/i)
val += i;
else
val += i + (n/i);
}
if (val > n)
return true;
return false;
}
}