幸运的是,这个程序工作正常,找到1到12的阶乘,但在12,13,14,20 .....输出出错,我也试图找到40的阶乘,输出为0.未能找到确切的问题......
#include <stdio.h>
int main() {
int user_input, tbl;
printf("Enter any number: \t");
scanf("%i", &user_input);
tbl = user_input;
for(int i=2; i < user_input; i++) {
tbl = tbl * i;
}
printf("Factorial of %i is %i", user_input, tbl);
}
Run Code Online (Sandbox Code Playgroud)
你得到一个整数溢出.在大多数机器上,int是32位宽(显然是签名).这意味着它可以代表的最大数字是2 ^ 31-1,即2147483648.12!工作原因是479001600(小于2 ^ 31-1)但是13!是6227020800.所以13!通常不能代表一个int.
你有一个选择是让i,user_input和tbl例如一个更大的类型unsigned long long或一个uint64_t(从#include <inttypes.h>).但是这些类型也具有最大可表示的数字.
如果您确实需要C中的任意精度,您可能需要考虑GMP(GNU多精度算术库).
另请注意,签名类型的溢出在C中具有未定义的行为.