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
相关产品推荐
相关产品推荐

