尝试用 C 编写一个阶乘程序

try to make a factorial program in C

幸运的是,这个程序可以很好地找到 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);

}

你得到了 integer overflow。在大多数机器上,int 是 32 位宽(并且显然是有符号的)。这意味着它可以表示的最大数字是 2^31-1,即 2147483648。12!它的工作原理是 479001600(小于 2^31-1)但是 13!是 6227020800。所以 13!通常不能用 int.

表示

您可以选择将 iuser_inputtbl 设为更大的类型,例如 unsigned long longuint64_t(来自 #include <inttypes.h>).但是这些类型也将具有最大可表示数。

如果您确实需要 C 中的任意精度,您可能需要考虑 GMP(GNU 多精度 算术库).

另请注意,签名类型的溢出在 C 语言中具有未定义的行为。

  • 8bit unsigned char Max:0xFF-->255 ->2^8 - 1 (char)2^7 -1
  • 16bit unsigned short Max:0xFFFF -->2^16 - 1(short)2^15 - 1
  • 32 位无符号整数 Max:0xFFFFFFFF -->2^32 - 1(int)2^31 - 1
  • 64 位无符号.....最大值:... --> 2^64 - 1(long long)2^63 - 1
  • 都有Range.This不是纸上写的数