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

标签 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;
}

这是我尝试使用算术级数公式编写更有效的解决方案:

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/

相关文章:

java - 什么是NullPointerException,我该如何解决?

c# - 具有最大行数的 Writer txt 文件

python - 将列表的列表子索引到 block 矩阵 X = [ [A, B], [C, D]]

algorithm - 寻找罕见或保留的 UTF-8 代码,以防止与文本内容冲突

algorithm - 如何查询在线上的所有点

iphone - 迁移到识别设备的新方法

java - 日期时间解析异常 : Text could not be parsed: Unable to obtain LocalDateTime from TemporalAccessor

java - java.lang.Object.notify( native 方法)线程 "AWT-EventQueue-0"java.lang.IllegalMonitorStateException 中出现异常

java - 这个 "method linking"对其他组件的(最佳)名称或描述是什么

java:线程没有完全完成run()方法?