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

我的C++ FizzBuzz程序运行异常,部分倍数未替换求助

解决C++ FizzBuzz程序的逻辑错误

问题描述

编写C++版本的FizzBuzz程序,需求为打印1-100的数字,其中3的倍数替换为"Fizz",5的倍数替换为"Buzz",同时是3和5的倍数替换为"FizzBuzz"。程序运行无报错,但6、21、36等3的倍数未被替换为"Fizz",10、25、40等5的倍数未被替换为"Buzz"。

错误代码

#include <stdio.h>
#include <iostream>
using namespace std;

int main() 
{
    
    for (int i = 1; i < 101; i++)
    {
        
        if ((i%3) == 0 && (i%5) == 0)
        {
            printf("FizzBuzz ");
            i++;
        }
        else if ((i%3) == 0)
        {
            printf("Fizz ");
            i++;
        }
        else if ((i%5) == 0)
        {
            printf("Buzz ");
            i++;
        }
        
        printf("%d ", i);

    }

    return 0;

}

预期输出

[Running] cd "d:\Projects\VS Code\Jetlag\helloworld\" && g++ fzz.cpp -o fzz && "d:\Projects\VS Code\Jetlag\helloworld\"fzz
1 2 Fizz 4 Buzz Fizz 7 8 Fizz Buzz 11 Fizz 13 14 FizzBuzz 16 17 Fizz 19 Buzz Fizz 22 23 Fizz Buzz 26 Fizz 28 29 FizzBuzz 31 32 Fizz 34 Buzz Fizz 37 38 Fizz Buzz 41 Fizz 43 44 FizzBuzz 46 47 Fizz 49 Buzz Fizz 52 53 Fizz Buzz 56 Fizz 58 59 FizzBuzz 61 62 Fizz 64 Buzz Fizz 67 68 Fizz Buzz 71 Fizz 73 74 FizzBuzz 76 77 Fizz 79 Buzz Fizz 82 83 Fizz Buzz 86 Fizz 88 89 FizzBuzz 91 92 Fizz 94 Buzz Fizz 97 98 Fizz Buzz 
[Done] exited with code=0 in 6.043 seconds

实际输出

[Running] cd "d:\Projects\VS Code\Jetlag\helloworld\" && g++ FizzBuzz.cpp -o FizzBuzz && "d:\Projects\VS Code\Jetlag\helloworld\"FizzBuzz
1 2 Fizz 4 Buzz 6 7 8 Fizz 10 11 Fizz 13 14 FizzBuzz 16 17 Fizz 19 Buzz 21 22 23 Fizz 25 26 Fizz 28 29 FizzBuzz 31 32 Fizz 34 Buzz 36 37 38 Fizz 40 41 Fizz 43 44 FizzBuzz 46 47 Fizz 49 Buzz 51 52 53 Fizz 55 56 Fizz 58 59 FizzBuzz 61 62 Fizz 64 Buzz 66 67 68 Fizz 70 71 Fizz 73 74 FizzBuzz 76 77 Fizz 79 Buzz 81 82 83 Fizz 85 86 Fizz 88 89 FizzBuzz 91 92 Fizz 94 Buzz 96 97 98 Fizz 100 
[Done] exited with code=0 in 0.987 seconds

问题分析

核心错误在于手动在if分支中递增i,而for循环本身会在每次迭代结束后自动递增i,导致逻辑混乱:

  • 当匹配到Fizz/Buzz/FizzBuzz时,i被手动加1,随后printf("%d ", i)直接输出这个已递增后的i,跳过了对该数字的规则判断
  • 循环再次递增i,进一步跳过下一个数字的处理,最终导致部分倍数数字未被正确替换

修正后的代码

#include <stdio.h>
#include <iostream>
using namespace std;

int main() 
{
    for (int i = 1; i < 101; i++)
    {
        if ((i % 3) == 0 && (i % 5) == 0)
        {
            printf("FizzBuzz ");
        }
        else if ((i % 3) == 0)
        {
            printf("Fizz ");
        }
        else if ((i % 5) == 0)
        {
            printf("Buzz ");
        }
        else
        {
            printf("%d ", i);
        }
    }
    return 0;
}

验证结果

修正后的代码会严格按照需求输出:1-100的数字中,3的倍数显示"Fizz",5的倍数显示"Buzz",同时是3和5倍数的显示"FizzBuzz",其余显示原数字,与预期输出完全一致。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.19 04:05:16