这是我写的第一个效率低下的方法:
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
答案 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