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

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();

核心问题分析

  1. 循环条件判断时机错误,累加了超范围数值
    你的两个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)。
  2. 题目范围误解
    Project Euler第1题原题要求的是小于1000的数,而非“1000及以下”,这是你错误累加1000的直接原因。

  3. 冗余的去重逻辑
    你在第一个循环里用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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.13 15:12:03