【问题标题】:Project Euler #23 (Java). I can't figure out what's wrong. Answer is off by 64欧拉计划 #23 (Java)。我不知道出了什么问题。答案关闭 64
【发布时间】:2015-01-22 16:55:40
【问题描述】:

问题是:

完美数是一个数,它的真因数之和正好等于这个数。例如,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; }
}

感谢任何帮助。

【问题讨论】:

    标签: java perfect-numbers


    【解决方案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);
            }
        }
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-05-13
      • 1970-01-01
      • 2019-01-29
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多