我试图计算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
非常感谢!
答案 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进行操作。