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



一周之后,我花了这个问题,我找不到我的错误。问题是:

一个完美的数字是其适当除数的总和完全等于数字的数字。例如,28的适当除数的总和将为1 2 4 7 14 = 28,这意味着28是一个完美的数字。 如果其适当的除数的总和小于n,则数字n被称为缺陷,如果此总和超过n,则称为丰富。 AS 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。

错误在哪里?

您的总和方法无法获得完美正方形的正确总和,因为您的循环在平方根之前停止。例如,如果您称为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;
}

相关内容