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

阶乘计算程序对大于12的数值返回错误结果的问题求助

问题根源及解决办法

核心问题:整数溢出

没错,就是数值过大导致的问题。你代码里用的long类型在绝大多数系统里是32位有符号整数,最大值是2147483647。算阶乘的话:

  • 12的阶乘是479001600,还在这个范围内,所以能得到正确结果
  • 13的阶乘直接冲到6227020800,远超long的上限,触发整数溢出。溢出后数值会被截断,变成一个错误的数(通常是负数或者无意义的正数),自然输出不对。

额外坑:格式符不匹配

还有个容易忽略的问题:main里的printf用了%d(对应int类型),但calcFactorial返回的是long类型,类型不匹配会导致输出乱码——哪怕阶乘没溢出,也可能打出错误值。应该把格式符改成%ld。

解决思路

  1. 换用更大的整数类型:比如unsigned long long,它的最大值是18446744073709551615,能正确计算到20的阶乘。修改后的代码如下:
#include <stdio.h>

unsigned long long calcFactorial(int x){
    unsigned long long result = 1;
    while(x > 0){
        result *= x;
        x--;
    }
    return result;
}
int main(){
    int x;
    printf("Enter a number: ");
    scanf(" %d",&x);
    printf("%llu", calcFactorial(x));
}
  1. 如果要算更大的阶乘(比如超过20),基本整数类型就不够用了,得自己用数组或者字符串实现大整数乘法,手动处理每一位的进位。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.23 14:03:22