幸运的是,这个程序可以很好地找到 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);
}
你会得到一个整数溢出 https://en.wikipedia.org/wiki/Integer_overflow。在大多数机器上,int
是 32 位宽(并且有明显的签名)。这意味着它可以表示的最大数字是2^31-1,即2147483648。12!工作原理是 479001600(小于 2^31-1)但是 13!是 6227020800。所以 13!通常不能用int
.
你有一个选择是i
, user_input
and tbl
更大的类型,例如 aunsigned long long
or a uint64_t
(from #include <inttypes.h>
)。但这些类型也有最大可表示数量。
如果您实际上需要 C 中的任意精度,您可能需要考虑GMP(GNU
多重精度
算术库) https://gmplib.org/.
另请注意,有符号类型的溢出在 C 中具有未定义的行为。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)