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

C++无限阶乘程序出现负数结果,寻求问题原因

阶乘程序输出负数的原因解析

我编写了一个C++程序,预期能从1开始无限输出各数的阶乘。程序前几个结果符合预期,但后续输出负数,最终因循环条件终止。我无法理解正常运行的阶乘程序为何出现负数。

程序代码

#include<iostream>
using namespace std;
int main(){
    int a = 1;
    int c = 1;
    while(a>0){
        cout<<(a*c)<<endl;
        
        a = a*c;
        c = c+1;
    }
    return 0;
}

预期结果

从1开始无限输出阶乘值

实际运行结果

1
2
6
24
120
720
5040
40320
362880
3628800
39916800
479001600
1932053504
1278945280
2004310016
2004189184 //数值不增反降
-288522240 //出现负数

原因解析

这是整数溢出导致的典型问题:

  • 你使用的int类型在绝大多数系统中是32位有符号整数,其取值范围固定为 -2^31 到 2^31-1(即 -2147483648 到 2147483647)。
  • 阶乘的增长速度极快,13的阶乘 13! = 6227020800 已经远超32位有符号int的最大值。
  • 有符号整数发生溢出时,会遵循补码循环规则产生错误结果:原本递增的数值会突然回落,甚至变为负数——这就是你看到数值不增反降、出现负数的直接原因。
  • 当溢出后的a变为负数时,循环条件while(a>0)不再满足,程序随即终止。

另外补充一点:你的代码逻辑本身是正确的,但受限于int的取值范围,无法承载更大的阶乘值。若要解决该问题,可替换为更大范围的整数类型,比如long long(64位有符号整数,可容纳至20!);若需要计算更大的阶乘,则需使用任意精度整数库或自行实现大整数运算逻辑。


内容的提问来源于stack exchange,提问作者Ayush Kumar Gupta

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.18 08:47:20