我已经在这个问题上工作了一段时间,我相信我的方法会起作用。我得到了我目前的答案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);
布尔数组。索引的实际值是两个数字的总和,如果不是
则为假 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;
}
}
答案 0 :(得分:0)
我不确定出了什么问题,但我觉得isAbundant是错的。尝试使用此版本。
public static boolean isAbundant(long n) {
long val = 1;
for (int i = 2; i*i <= n; i++)
if (n % i == 0)
val += i;
return val == n;
}