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