经过一个星期,我花了这个问题,我找不到我的错误。 问题是:
完美数字是一个数字,其正确除数的总和恰好等于数字。例如,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。
哪里出错?
答案 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;
}