阶乘计算程序对大于12的数值返回错误结果的问题求助
问题根源及解决办法
核心问题:整数溢出
没错,就是数值过大导致的问题。你代码里用的long类型在绝大多数系统里是32位有符号整数,最大值是2147483647。算阶乘的话:
- 12的阶乘是479001600,还在这个范围内,所以能得到正确结果
- 13的阶乘直接冲到6227020800,远超
long的上限,触发整数溢出。溢出后数值会被截断,变成一个错误的数(通常是负数或者无意义的正数),自然输出不对。
额外坑:格式符不匹配
还有个容易忽略的问题:main里的printf用了%d(对应int类型),但calcFactorial返回的是long类型,类型不匹配会导致输出乱码——哪怕阶乘没溢出,也可能打出错误值。应该把格式符改成%ld。
解决思路
- 换用更大的整数类型:比如
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)); }
- 如果要算更大的阶乘(比如超过20),基本整数类型就不够用了,得自己用数组或者字符串实现大整数乘法,手动处理每一位的进位。
内容的提问来源于stack exchange,提问作者kha
相关产品推荐
相关产品推荐

