繁体   English   中英

尝试在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);

}

你得到一个整数溢出 在大多数机器上, 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中具有未定义的行为。

  • 8位无符号字符最大值:0xFF - > 255 - > 2 ^ 8 - 1(字符)2 ^ 7 -1
  • 16位无符号短最大值:0xFFFF - > 2 ^ 16 - 1(短)2 ^ 15 - 1
  • 32位无符号整数最大值:0xFFFFFFFF - > 2 ^ 32 - 1(整数)2 ^ 31 - 1
  • 64位无符号.....最大:... - > 2 ^ 64 - 1(长很长)2 ^ 63 - 1
  • 所有都有Range.This不是写在纸上的数字。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM