我想通过使用算术级数公式更有效地解决Project Euler#1,但我的算法会返回略微偏离的答案

时间:2018-04-24 01:13:35

标签: java algorithm

这是我写的第一个效率低下的方法:

public int sumOfMultiplesOf3or5Under1000() {
    int sum = 0;
    for (int i = 0; i < 1000; i++) {
        if (i % 3 == 0 || i % 5 == 0) {
            sum += i;
        }
    }
    return sum;
}

以下是我尝试使用arithemtic进展公式编写更有效的解决方案:

public int usingAP() {
    return sumOfAP(3,3,333) + sumOfAP(5,5,199) - sumOfAP(15,15,66); 
}

public int sumOfAP(int firstTerm, int commonDifference, int numberOfTerms){
    int sum = (numberOfTerms / 2) * (2 * firstTerm + (numberOfTerms - 
               1) * commonDifference);
    return sum;
}

当我调用sumOfMultiplesOf3or5Under1000()时,我得到了正确答案:

233168

当我打电话给使用AP()时,我得到一个只有1,001的答案:

232167

1 个答案:

答案 0 :(得分:2)

我不确定为什么你认为你的第一种方法效率低下,原因我在上面的评论中说过。然而,您似乎成了sumOfAP方法中舍入错误的受害者。你很接近,但你只需要一些方法将临时变量存储为double而不是int,这样你就可以保持精度。我能够通过除以2D而不是2来对其进行修正:

public static int sumOfAP(int firstTerm, int commonDifference, int numberOfTerms){
    return (int) ((numberOfTerms / 2D) * (2D * firstTerm + (numberOfTerms - 1) * commonDifference));
}

您可以运行以下内容并验证它们是否相同:

System.out.println(usingAP());
System.out.println(sumOfMultiplesOf3or5Under1000());

输出:

233168
233168