0

问题是:

完美数是一个数,其真因数之和正好等于该数。例如,28 的适当因数之和为 1 + 2 + 4 + 7 + 14 = 28,这意味着 28 是一个完美数。一个数 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; }
}

任何帮助表示赞赏。

4

1 回答 1

1

嵌套for循环应该以i代替开头i+1(否则您将忽略具有相同索引的 sum):

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);
        }
    }
}
于 2014-06-14T10:03:03.733 回答