如何计算大于12的整数的阶乘?C语言实现时输入12以上数值结果为0怎么解决
问题根因
- 32位有符号
int的最大正值为2147483647,而13的阶乘为6227020800,已经远超过该上限,触发有符号整数溢出,这是C语言标准规定的未定义行为,你看到输出0是溢出后数值回卷的结果。 - 改为
long int后输出乱码有两个原因:- 32位环境下
long int同样占4字节,取值范围和int完全一致,还是无法承载大于12的阶乘,溢出问题没有解决 - 你只修改了变量类型,
printf输出时还是用了对应int的格式化符%d,类型不匹配也会导致输出异常
- 32位环境下
修复方案
适配20以内阶乘计算
改用64位有符号整数类型long long,其最大正值为9223372036854775807,可以覆盖到20的阶乘(20! = 2432902008176640000),同时修改对应输出格式化符为%lld,另外建议把负数判断前置,避免输入负数时执行无效循环。修改后代码如下:
#include <stdio.h> int main() { int c, n; long long f = 1; printf("Enter a number to calculate its factorial\n"); scanf("%d", &n); if (n < 0) { printf("Cannot calculate the factorial of a negative number\n"); return 0; } for (c = 1; c <= n; c++) { f = f * c; } printf("Factorial of %d = %lld\n", n, f); return 0; }
计算20以上的阶乘
C标准库没有内置大整数支持,需要自行实现数组模拟大整数乘法,或者引入第三方大整数运算库实现。
内容的提问来源于stack exchange,提问作者Daniel Bland
相关产品推荐
相关产品推荐

