【发布时间】:2015-01-23 01:25:22
【问题描述】:
我一直在解决以下问题,但我得到了错误的答案。我的逻辑有什么问题?
完美数是一个数,它的真因数之和正好等于这个数。例如,28 的因数之和为 1 + 2 + 4 + 7 + 14 = 28,这意味着 28 是一个完美数。
如果一个数 n 的真因数之和小于 n 则称为不足数,如果该数之和超过 n 则称为丰富数。
由于12是最小的丰富数,1 + 2 + 3 + 4 + 6 = 16,所以可以写成两个丰富数之和的最小数是24。通过数学分析,可以证明所有大于 28123 的整数可以写成两个丰富数之和。但是,即使已知不能表示为两个丰富数之和的最大数小于此上限,也无法通过分析进一步降低此上限。
找出所有不能写成两个丰富数之和的正整数之和。
这是我的代码:
public class EulerProblem23 {
public static void main(String[] args) {
//First, I create an array containing all the numbers ranging from 1 to 28123.
int[] tall = new int[28123];
int x = 0;
for (int j = 1;j<=28123;j++){
tall[x] = j;
x++;
}
//Then, give all the numbers that can be written as the sum of two abundant numbers
//the value 0.
int forrige = 0;
for (int i = 1;i<=28123;i++){
if (isAbundant(i)){
if (2 * i <= 28123){
tall[i - 1] = 0;
}
if (forrige + i <= 28123){
tall[i - 1] = 0;
}
}
}
//All that's left should be summing all the numbers in the array.
long sum = 0;
for (int y = 0;y<28123;y++){
sum += tall[y];
}
System.out.println(sum);
}
public static boolean isAbundant(int n){
int sumAvDivisorer = 0;
for (int i = 1;i<n;i++){
if (n % i == 0){
sumAvDivisorer += i;
}
}
if (sumAvDivisorer > n){
return true;
}
else {
return false;
}
}
}
我的逻辑有问题吗?不是所有可以定义为两个丰富数之和的整数都变成0吗?
【问题讨论】:
-
forrige是干什么用的?i将始终小于或等于28123,因此您将数组中的所有值设置为0。 -
@Blender:不,我没有。 forrige 是在for循环中获取之前的值。我的数组中的所有值都没有设置为 0,这是不正确的。
-
哦,废话,对不起,你是对的。我忘了在循环结束时设置 forrige = i。
-
我似乎仍然得到了错误的答案,尽管
forrige = i设置在循环的末尾。 -
您的代码如何检查一个数字是否是任何两个小于 28123 的丰富数字之和?
标签: java arrays perfect-numbers