问题是:
完美数字是一个数字,其正确除数的总和恰好等于数字。例如,28的适当除数之和为1 + 2 + 4 + 7 + 14 = 28,这意味着28是一个完美数。 如果n的适当除数之和小于n,则数n被称为不足,如果该和超过n,则称其为n。 由于12是最小的有限数,1 + 2 + 3 + 4 + 6 = 16,可以写成两个有限数之和的最小数是24.通过数学分析,可以证明所有整数都大于28123可以写成两个数字的总和。然而,即使知道不能表示为两个丰富数字之和的最大数量小于该限制,也不能通过分析进一步降低该上限。
找出所有正整数的总和,这些正整数不能写成两个数字的总和。
我的方法创建一个低于限制的大量数字列表,创建一个通过向彼此添加大量数字而创建的数字列表,然后找到未出现在此列表中的数字,并添加它们以查找它们的总和。答案应该是4179871,而我得到4179935.我已经64岁了,我无法弄清楚原因。我的代码是:
public static void main(String[] args) {
int limit = 28124;
int sum=0;
int tempNum;
int listSize;
ArrayList<Integer> list = new ArrayList<Integer>();
ArrayList<Integer> sumList = new ArrayList<Integer>();
for (int i=0; i<limit; i++) {
if (isAbundant(i)) {
list.add(i);
}
}
listSize = list.size();
for (int i=0; i<listSize; i++) {
for (int j=i+1; j<listSize; j++) {
tempNum = list.get(i) + list.get(j);
if (tempNum < limit) {
sumList.add(tempNum);
}
}
}
for (int i=1; i<limit; i++) {
if (sumList.contains(i) == false) {
sum += i;
}
}
System.out.println(sum);
}
public static boolean isAbundant(int n) {
int sum=0;
for (int i=1; i<n; i++) {
if (n%i==0) {
sum += i;
}
}
if (sum>n) { return true; }
else { return false; }
}
感谢任何帮助。
答案 0 :(得分:1)
嵌套for
循环应以i
而不是i+1
开头(否则您会忽略具有相同索引的和):
for (int i=0; i<listSize; i++) {
for (int j=i; j<listSize; j++) {
tempNum = list.get(i) + list.get(j);
if (tempNum < limit) {
sumList.add(tempNum);
}
}
}