这是我写的第一个低效方法:
public int sumOfMultiplesOf3or5Under1000() {
int sum = 0;
for (int i = 0; i < 1000; i++) {
if (i % 3 == 0 || i % 5 == 0) {
sum += i;
}
}
return sum;
}
这是我尝试使用算术级数公式编写更有效的解决方案:
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
当我调用 usingAP() 时,我得到的答案仅相差 1,001:
232167
最佳答案
我不确定为什么您认为第一种方法效率低下,原因如我在上面的评论中所述。尽管如此,您似乎还是 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
关于java - 我想通过使用算术级数公式更有效地解决 Project Euler #1,但我的算法返回的答案略有偏差,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49992037/