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

