尝试用C编写阶乘程序

2023-12-25

幸运的是,这个程序可以很好地找到 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(使用前将#替换为@)

尝试用C编写阶乘程序 的相关文章

随机推荐