项目欧拉#23(Java)。我无法弄清楚出了什么问题。答案是64岁

时间:2014-06-14 09:16:51

标签: java perfect-numbers

问题是:

  

完美数字是一个数字,其正确除数的总和恰好等于数字。例如,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; }
}

感谢任何帮助。

1 个答案:

答案 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);
        }
    }
}