euler项目23 - 在我的代码中找不到错误[Java]

时间:2017-03-04 16:58:55

标签: java

经过一个星期,我花了这个问题,我找不到我的错误。 问题是:

  

完美数字是一个数字,其正确除数的总和恰好等于数字。例如,28的适当除数之和为1 + 2 + 4 + 7 + 14 = 28,这意味着28是一个完美数。   如果n的适当除数之和小于n,则数n被称为不足,如果该和超过n,则称其为n。   由于12是最小的有限数,1 + 2 + 3 + 4 + 6 = 16,可以写成两个有限数之和的最小数是24.通过数学分析,可以证明所有整数都大于28123可以写成两个数字的总和。然而,即使已知不能表示为两个充裕数的总和的最大数量小于该限制,也不能通过分析进一步减小该上限。   找出所有正整数的总和,这些正整数不能写成两个数字的总和。

所以我的代码是:

package eulerProject;
import java.util.*;

import java.math.BigInteger;

public class e23 {

public static void main(String[] args) {
    ArrayList<Integer> list = new ArrayList<>();

    BigInteger sum = BigInteger.ZERO;

    for (int i = 1; i <= 28123; i++) {

        if (!check(i))
            list.add(i);
    }

    System.out.println(list);

    for (int i = 0; i < list.size(); i++)
        sum = sum.add(BigInteger.valueOf(list.get(i)));

    System.out.println(sum);

}

public static boolean check(long z) {

    long y = 0;

    for (long i = 1; i <= z / 2; i++) {
        if (abundant(i)) {
            y = z - i;

            if (abundant(y)) {
                return true;
            }

            y = 0;
        }
    }

    return false;
}

public static long sum(long x) {
    long sum = 0;

    for (int i = 1; i < (Math.sqrt(x)); i++) {
        if (x % i == 0) {
            if (x / i == i) {
                sum += i;
            } else {
                sum = sum + i + (x / i);
            }
        }
    }

    sum = sum - x;
    return sum;
}

public static boolean abundant(long x) {
    if (sum(x) > x)
        return true;
    return false;
}
}

我将解释这些方法:

“sum” - 对一个数字的所有适当除数求和。 (如数字= 12,所以总和:1 + 2 + 3 + 4 + 6。)

“丰富” - 只需通过计算其除数和数字本身的总和来检查数字是否丰富。

“check” - 生成两个数字,它们的总和是我们检查的数字 - 并检查这两个数字是否丰富。如果他们这样返回真实。

并且主要只是生成数字直到最大限制,添加到列表然后我对列表求和。

我的回答是:4190404。 正确答案是:4179871。

哪里出错?

1 个答案:

答案 0 :(得分:0)

你的求和方法没有得到完美正方形的正确和,因为你的循环在平方根之前停止。例如,如果你调用sum(16),则循环将运行到i = 3并停止,因此4将不会对总和做出贡献。

解决方案:

(我还解决了一些效率低下问题。)

public static long sum(long x){ 
long sum = 1;
int sqrt = (int)Math.sqrt(x);

for (int i = 2; i <= sqrt; i++) {
    if (x % i == 0) {
        sum += i + (x/i);
    }
}
//checks if perfect square and subtracts out extra square root.
if(sqrt * sqrt == x) sum -= sqrt;  

return sum;
}