You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用Java求解Project Euler第一题时,返回求和结果遇到问题

解决Project Euler第一题的Java程序求和问题

嘿,我懂你现在卡在哪了!你的思路大方向是对的,但有个很容易忽略的小陷阱——同时是3和5的倍数的数(比如15、30、45这类15的倍数)会被你重复计算两次:第一次算3的倍数时加了一遍,算5的倍数时又加了一遍,最终结果肯定会比正确值偏大。

正确的解题思路

要修正这个问题,你有两种简洁的做法:

  • 方法一:先分别算3的倍数和、5的倍数和,再减去15的倍数和(抵消重复计算的部分)
  • 方法二:直接遍历每个数,只要它是3或5的倍数就加一次,从根源避免重复

方法一:用等差数列求和(高效版)

这种方法不用循环遍历每个数,用数学公式计算,效率更高,尤其是当范围很大的时候:

public class EulerProblem1 {
    public static void main(String[] args) {
        int limit = 1000; // 注意:题目要求是小于1000的数,别写成<=1000哦
        int sumOfMultiples3 = calculateMultipleSum(3, limit);
        int sumOfMultiples5 = calculateMultipleSum(5, limit);
        int sumOfMultiples15 = calculateMultipleSum(15, limit);
        
        int total = sumOfMultiples3 + sumOfMultiples5 - sumOfMultiples15;
        System.out.println("求和结果:" + total);
    }

    // 辅助方法:计算小于limit的n的所有倍数的和
    private static int calculateMultipleSum(int n, int limit) {
        // 先算有多少个符合条件的倍数:比如小于1000的3的倍数,最大是999,个数是999/3=333
        int count = (limit - 1) / n;
        // 等差数列求和公式:n*(1+2+...+count) = n * count*(count+1)/2
        return n * count * (count + 1) / 2;
    }
}

方法二:循环遍历(直观版)

如果觉得数学公式有点绕,用循环的方式更直白,直接判断每个数是否符合条件,避免重复:

public class EulerProblem1Loop {
    public static void main(String[] args) {
        int limit = 1000;
        int totalSum = 0;
        
        for (int i = 1; i < limit; i++) {
            // 只要是3的倍数 或者 5的倍数,就加一次,不会重复计算
            if (i % 3 == 0 || i % 5 == 0) {
                totalSum += i;
            }
        }
        
        System.out.println("求和结果:" + totalSum);
    }
}

小提醒

一定要确认你的范围是否正确:Project Euler第一题明确要求是小于1000的正整数,如果你不小心写成i <= limit,结果就会包含1000(但1000不是3或5的倍数,其实不影响,但最好严格按题目要求来)。

内容的提问来源于stack exchange,提问作者TheBlackRose

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.21 07:22:29