为项目Euler获取63252 21.为什么这不正确?

时间:2016-06-24 00:39:22

标签: java

项目欧拉问题:

设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

1 个答案:

答案 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);