Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/371.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 我想通过使用算术级数公式来更有效地求解Project Euler#1,但我的算法返回的答案稍微有点偏离_Java_Algorithm - Fatal编程技术网

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

Java 我想通过使用算术级数公式来更有效地求解Project Euler#1,但我的算法返回的答案稍微有点偏离,java,algorithm,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; } 当我在1000下调用3或5的乘法之和()时,我得到了正确的答案: 233

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

public int sumOfMultiplesOf3or5Under1000() {
    int sum = 0;
    for (int i = 0; i < 1000; i++) {
        if (i % 3 == 0 || i % 5 == 0) {
            sum += i;
        }
    }
    return sum;
}
当我在1000下调用3或5的乘法之和()时,我得到了正确的答案:

233168

当我调用usingAP()时,我得到的答案只差1001秒:


我不知道为什么你认为你的第一个方法是低效的,原因是我在上面的评论中所说的。然而,您似乎成为了
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

为什么你认为第一种方法效率低?只需几秒钟就可以计算出10亿美元的总和。@JacobG。也许他想把
int
改为
long
并计算10000000000000000000000,然后第一种方法大约需要30年,但第二种方法仍然差不多。非常感谢!
233168
233168