C语言阶乘x!计算代码仅输入a≤12时结果正确,是什么原因?
问题原因分析
核心问题是整数溢出:
你代码里存储阶乘结果的变量x定义为int类型,绝大多数C语言编译环境中int是32位有符号整数,可表示的最大值为2^31 - 1 = 2147483647。
计算可得:
- 12! = 479001600,小于2147483647,所以计算结果正常
- 13! = 6227020800,远大于32位有符号int的最大值,触发整数溢出。C语言标准中,有符号整数溢出属于未定义行为,因此会输出错误的结果。
解决方案
- 方案1:使用取值范围更大的整数类型,比如
long long(64位有符号整数,最大值为9223372036854775807,最多可正确计算到20!),修改后的代码如下:
int main() { int a; long long x = 1; scanf("%d", &a); while (1 < a){ x = a * x; a = (a - 1); printf("\n %lld", x); }; printf("\n %lld", x); return 0; }
- 方案2:如果需要计算更大的阶乘,需要自己实现大整数运算逻辑,用数组存储每一位的计算结果。
内容的提问来源于stack exchange,提问作者Rayane Atoui
相关产品推荐
相关产品推荐

