Project Euler第1题代码输出异常求助(Visual Studio 2022)
Project Euler第1题代码问题排查
我正在用Visual Studio 2022做Project Euler第1题,题目要求计算小于1000的所有3或5的倍数之和(10以内的例子和为23)。自己调试数小时,对比朋友的正确代码也没找到问题。我的代码运行后输出235170,正确答案是233168。把第一个循环条件改成x < 996时,输出233169,只差1。刚学编程一个月,求帮忙排查问题。
我的代码:
int x = 0, y = 0, totalSum = 0; //multiples of 3 for (int i = 0; x < 1000; i++) { x = 3 * i; if (x % 5 != 0) { totalSum += x; Console.WriteLine(totalSum); } } //multiples of 5 for (int n = 0; y < 1000; n++) { y = 5 * n; totalSum += y; Console.WriteLine(totalSum); } Console.WriteLine(totalSum); Console.ReadKey();
核心问题分析
循环条件判断时机错误,累加了超范围数值
你的两个for循环都是先判断条件,再在循环体内更新x/y的值,这会导致最后一次循环处理超出范围的数:- 第一个循环:当
i=334时,循环开始前判断x=999 < 1000成立,进入循环体后计算出x=3*334=1002(已大于1000),却被加到了总和里。 - 第二个循环:当
n=200时,循环开始前判断y=995 <1000成立,进入循环体后计算出y=5*200=1000,但题目要求的是小于1000的数,1000不应被计入。
这两个额外累加的数(1002+1000=2002),刚好是你的输出与正确答案的差值(235170-233168=2002)。
- 第一个循环:当
题目范围误解
Project Euler第1题原题要求的是小于1000的数,而非“1000及以下”,这是你错误累加1000的直接原因。冗余的去重逻辑
你在第一个循环里用x%5 !=0避免重复累加公倍数,但这种方式容易出错,更清晰的逻辑是:先累加所有3的倍数,再累加所有5的倍数,最后减去所有15的倍数(因为它们被重复加了两次)。
修正后的代码
循环实现版(直观易懂)
int totalSum = 0; // 累加所有小于1000的3的倍数 for (int i = 3; i < 1000; i += 3) { totalSum += i; } // 累加所有小于1000的5的倍数 for (int i = 5; i < 1000; i += 5) { totalSum += i; } // 减去重复累加的15的倍数(同时是3和5的倍数) for (int i = 15; i < 1000; i += 15) { totalSum -= i; } Console.WriteLine(totalSum); // 输出233168 Console.ReadKey();
数学公式版(高效适合大数范围)
// 计算小于limit的n的倍数之和 int SumMultiples(int n, int limit) { int count = (limit - 1) / n; return n * count * (count + 1) / 2; } int totalSum = SumMultiples(3, 1000) + SumMultiples(5, 1000) - SumMultiples(15, 1000); Console.WriteLine(totalSum); // 输出233168 Console.ReadKey();
内容的提问来源于stack exchange,提问作者Madeleine
相关产品推荐
相关产品推荐

