C处理具有大数的阶乘

时间:2017-11-27 10:40:06

标签: c gcc recursion buffer factorial

我试图计算52!使用C语言。但似乎不知怎的,我无法处理大数字。如果它是我的编译器,或者我做错了,我就无法做到。

#include <stdio.h>
#include <stdlib.h>
#include <inttypes.h>

uint64_t factorielle(int n) {
   if(n == 0)
       return 1;
    else
      return n * factorielle(n-1);
}

int main(int argn, char** argv) {

  printf("Number : %"PRId64"\n", factorielle(52));

  return 0;
}

我得到了这个结果:

Number : -8452693550620999680

我尝试使用GCC 5.3.0,GCC 7.2.0和Zapcc 5.0.0

非常感谢!

3 个答案:

答案 0 :(得分:3)

您永远不能在52!整数类型(64位)的任何中表示C。一种解决方案是使用您自己的数据结构来表示那么大的值,或者尝试找到一些库(例如提供该工具的GMP

您可以检查2^64本身的值1.8446744e+19是否远小于8.0658175e+67。因此,integer中无法使用C类型。

的更多想法您永远不能在任何52!整数类型中代表C

正如提到的那样,许多系统使用64位整数类型(int64_t)是不可能的。让我们深入研究这个问题。 (54!需要238二进制单位)。使用int256_t类型,可以表示52!。但int256_t目前不是标准类型。 DEC VAX甚至支持128位整数运算。 至于mentioned chux即使现在各种编译器也支持128位整数类型和操作,因此扩展它以支持256位整数类型并非不可能。然后我猜不能说你永远不能在任何52!整数类型中代表C

答案 1 :(得分:3)

详细了解factorials

提示:如果您不熟悉该主题,在编码之前阅读一点总是有用的。

尝试找出52的阶乘(例如其对数)的估计。为此,您可以使用Stirling's approximation。您会发现它确实是一个很大的数字(远大于2 64 -1,这通常是您的C实现可以处理的最大数字)。

考虑使用一些arbitrary precision arithmetic(a.k.a。&#34; bignum&#34; s)库,例如GMPlib。顺便说一下,高效的bignum库真的很难编码(因此你会比现有的库给你的更糟糕)因为他们的算法非常困难。

也许你不需要计算这么大的因子。

答案 2 :(得分:2)

54岁因素

230843697339241380472092742683027581083278564571807941132288000000000000

太大而无法处理C中的任何原始数据类型。

如果您尝试实施一个因子程序来计算如此大数字的阶乘,那么您可以按照tutorial进行操作。