【问题标题】:try to make a factorial program in C尝试用 C 编写一个阶乘程序
【发布时间】:2016-01-19 10:07:10
【问题描述】:

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

}

【问题讨论】:

标签: c factorial


【解决方案1】:

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

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

如果您确实需要 C 中的任意精度,您可能需要考虑 GMP (The GNU Multiple Precision Arithmetic Library)

另外请注意,有符号类型的溢出在 C 中具有未定义的行为。

【讨论】:

  • @forweb 这是一个编译时属性。您可以使用 sizeof 查询 a 类型的长度(以字节为单位)。例如,sizeof(int) 很可能是您的 4CHAR_BITS 告诉你一个字节有多少位(几乎总是8)。
  • @forweb 如果您对int 可以容纳的最大数量感兴趣,#include &lt;limits.h&gt; 确实有INT_MAX(可能是 2147483647 == 2^32-1)。跨度>
  • 无需查看sizeof int。每个 C 实现都有一个&lt;limits.h&gt;,其中包含一组宏,这些宏扩展为所有数字类型的最大值,等等。例如,INT_MAX 是(实现定义的)int 类型的最大值。对于最近的固定宽度整数类型,&lt;stdint.h&gt; 中还有一组宏。
  • @forweb 不是真的,double 是浮点数,所以你不会得到整数
  • @forweb 答案其实告诉你了,使用 unsigned long long
【解决方案2】:
  • 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
  • 32bit unsigned int Max:0xFFFFFFFF -->2^32 - 1(int)2^31 - 1
  • 64bit unsigned.....Max:... --> 2^64 - 1(long long)2^63 - 1
  • 都有范围。这不是纸上写的数字。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-11-13
    • 2014-12-22
    • 1970-01-01
    • 2019-10-22
    • 1970-01-01
    • 2016-05-29
    相关资源
    最近更新 更多