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

Java计算1000以下3或5的倍数之和:算法错误排查求助

问题分析与解决方案

嘿,我一眼就瞅出你代码里的小问题啦!你算出的266333结果不对,核心原因是重复计算了同时是3和5倍数的数——也就是15的倍数(比如15、30、45...),这些数在第一个循环(统计3的倍数)里被加了一次,第二个循环(统计5的倍数)里又被加了一次,相当于多算了一遍这部分的和,所以结果就偏大了。

问题拆解

举个小例子验证:比如计算15以内3和5的倍数之和,正确结果应该是3+5+6+9+10+12+15=60,但用你的代码算的话,会得到3+6+9+12+15 +5+10+15=75,这里15被重复加了一次,多出来的15就是误差来源。

修正方案

这里给你几种简单的修正思路:

方案1:减去重复计算的15的倍数

先计算3的倍数总和,加上5的倍数总和,再减去15的倍数总和(因为这部分被加了两次,要减掉一次):

int count = 0;
// 统计3的倍数之和
for (int i = 0; i < 1000; i += 3) {
    count += i;
}
// 统计5的倍数之和
for (int i = 0; i < 1000; i += 5) {
    count += i;
}
// 减去重复统计的15的倍数之和
for (int i = 0; i < 1000; i += 15) {
    count -= i;
}
System.out.println(count); // 输出正确结果233168

方案2:单循环判断,从根源避免重复

直接在一个循环里判断当前数是否是3或5的倍数,符合条件才累加,完全不会出现重复计算的情况:

int count = 0;
for (int i = 0; i < 1000; i++) {
    if (i % 3 == 0 || i % 5 == 0) {
        count += i;
    }
}
System.out.println(count);

方案3:用数学公式(高效无循环)

如果追求更高效率,可以用等差数列求和公式,不用循环也能算出结果:

  • 3的倍数之和:首项3,末项999,项数333,和为 (3 + 999) * 333 / 2 = 166833
  • 5的倍数之和:首项5,末项995,项数199,和为 (5 + 995) * 199 / 2 = 99500
  • 15的倍数之和:首项15,末项990,项数66,和为 (15 + 990) * 66 / 2 = 33165
  • 最终总和:166833 + 99500 - 33165 = 233168

代码实现如下:

int sum3 = (3 + 999) * 333 / 2;
int sum5 = (5 + 995) * 199 / 2;
int sum15 = (15 + 990) * 66 / 2;
int count = sum3 + sum5 - sum15;
System.out.println(count);

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.21 04:02:35