项目欧拉问题:
设d(n)定义为n的适当除数之和(小于n的数均匀分为n)。 如果d(a)= b且d(b)= a,其中a≠b,则a和b是友好对,a和b中的每一个都称为友好数字。
例如,220的适当除数是1,2,4,5,10,11,20,22,44,55和110;因此d(220)= 284. 284的适当除数是1,2,4,71和142;所以d(284)= 220。
评估10000以下所有友好数字的总和。
我的Java解决方案:
public class problem21 {
private static int answer = 0;
public static void main(String[] args){
for(int a = 1; a<10000; a++){
int b = calculateSumOfDivisorsOf(a);
if(calculateSumOfDivisorsOf(b) == a && b!=a){
//amicable numbers
//a is always amicable
answer+=a;
if(b<10000){
//b is an amicable number under 10000
answer+=b;
}
}
}
System.out.println(answer);
}
public static int calculateSumOfDivisorsOf(double num){
String divisors = "1";
int sum = 0;
for(int i = 2; i< Math.sqrt(num); i++){
if(num%i == 0){
divisors+= " " + i;
if(num/i != i){
divisors += " " + num/i;
}
}
}
double[] divisorsArr = new double[divisors.split("\\s+").length];
for(int i = 0; i< divisors.split("\\s+").length; i++)
divisorsArr[i] = Double.parseDouble(divisors.split("\\s+")[i]);
for(int i = 0; i < divisorsArr.length; i++)
sum+= divisorsArr[i];
return sum;
}
}
我的(不正确)答案: 63252
我的代码出了什么问题? 正确答案是31626
答案 0 :(得分:1)
当我尝试调试您的代码时,我发现您添加了两次b(友好数字)。检查您的代码和输出。
for (int a = 1; a < 10000; a++) {
int b = calculateSumOfDivisorsOf(a);
if (calculateSumOfDivisorsOf(b) == a && b != a) {
// amicable numbers
// a is always amicable
answer += a;
System.out.println(a); //NOTE I AM PRINTING 'a'
if (b < 10000) {
// b is an amicable number under 10000
answer += b;
System.out.println(b); // //NOTE I AM PRINTING 'b'
}
}
}
输出是:
220
284
284
220
1184
1210
1210
1184
2620
2924
2924
2620
5020
5564
5564
5020
6232
6368
6368
6232
现在您可以看到您正在添加a,b两次。您没有检查a,b是否已添加。检查以下代码。
List<Integer> l = new ArrayList<Integer>(); //List to add a,b
for (int a = 1; a < 10000; a++) {
int b = calculateSumOfDivisorsOf(a);
if (calculateSumOfDivisorsOf(b) == a && b != a && !l.contains(a) && !l.contains(b)) { //Check whether list contain a,b
// amicable numbers
// a is always amicable
answer += a;
l.add(a); //add a to list
if (b < 10000) {
// b is an amicable number under 10000
answer += b;
l.add(b); //add b to list
}
}
}
System.out.println(answer);