我已经研究这个问题有一段时间了,我相信我的方法会起作用。我通过两种不同的求和方法得到了当前的答案 4190404。在数字 21(友好数字)中,我使用相同的算法对数字的除数进行求和,这让我确信它可以正常工作。我查看了博客寻求指导,但一无所获。如果有人能指出我正确的方向,我将非常感激。
import java.util.ArrayList;
public class problem23 {
public static void main(String[] args) {
int upperLimit = 28123;
long sum = 0;
列出我的上限以下的所有丰富数字
ArrayList<Long> abunNums = new ArrayList<Long>();
abunNums.add((long) 0);
for (long i = 1; i <= upperLimit; i++)
if (isAbundant(i))
abunNums.add(i);
boolean 数组。 true 索引是两个丰富数字的总和,否则 false
boolean[] isSumOfAbun = new boolean[upperLimit+1];
int j = 0;
for (int i = 1; i < abunNums.size(); i++) {
j = i;
while (abunNums.get(i) + abunNums.get(j) <= upperLimit) {
isSumOfAbun[(int) (abunNums.get(i) + abunNums.get(j))] = true;
j++;
}
}
//如果数字不能被描述为两个丰富数字的和,则循环遍历 boolean 数组 and 以及总和的索引
for (int i = 1; i <= upperLimit; i++)
if (!isSumOfAbun[i]) {
sum += i;
System.out.println(i);
}
System.out.println(sum);
}
测试数字是否丰富的方法
public static boolean isAbundant(long n) {
long val = 1;
for (int i = 2; i*i < n; i++)
if (n % i == 0) {
if (i == n/i)
val += i;
else
val += i + (n/i);
}
if (val > n)
return true;
return false;
}
}
最佳答案
我不太确定出了什么问题,但我有一种感觉 isAbundant 错了。尝试使用此版本。
public static boolean isAbundant(long n) {
long val = 1;
for (int i = 2; i*i <= n; i++)
if (n % i == 0)
val += i;
return val == n;
}
关于java - java 中的项目 euler 23 - 接近解决方案,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50204452/