尝试在C中制作一个阶乘程序

For*_*ech 2 c factorial

幸运的是,这个程序工作正常,找到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)

Joh*_*iss 7

你得到一个整数溢出.在大多数机器上,int是32位宽(显然是签名).这意味着它可以代表的最大数字是2 ^ 31-1,即2147483648.12!工作原因是479001600(小于2 ^ 31-1)但是13!是6227020800.所以13!通常不能代表一个int.

你有一个选择是让i,user_inputtbl例如一个更大的类型unsigned long long或一个uint64_t(从#include <inttypes.h>).但是这些类型也具有最大可表示的数字.

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

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

  • @forweb如果你对`int`可以容纳的最大数字感兴趣,`#include <limits.h>`确实有`INT_MAX`(可能是2147483647 == 2 ^ 32-1). (3认同)