存储大于20的数字! (阶乘)

时间:2011-11-15 09:18:14

标签: c

我正在尝试找到100!(阶乘)之前的数字,但在20!之后它会给出一个错误,因为该值太大而无法处理。我该如何存储这样的号码?

4 个答案:

答案 0 :(得分:11)

20阶乘是19位数。 100阶乘长158位,占用500位!实际上是:

933262154439441526816992388562667004907159682643816214685929638952175999932299156089414639761565182862536979208272237582511852109168640000000000000000
00000000

这里没有一种标准类型适合你,你需要做的是实现你自己的例程来处理这么大的数字。

例如,您需要接受将两个32位值相乘可能会产生64位结果。

这是在8位处理器时代计算大数的同时实践。 它被称为arbitrary precision arithemtic.

Here是描述如何完成此操作的链接。不可否认,它适用于汇编程序,但它仍然适用于此。您需要考虑系统上int的默认大小。

答案 1 :(得分:10)

至少在Linux上,一个可能的多精度库可能是GMP(它也适用于Solaris,Windows,MacOSX等......)。

答案 2 :(得分:1)

你怎么在纸上做? 使用长度为160位的数字进行乘法对计算机来说并不难。

尝试编写自己的函数或使用现有的库。

答案 3 :(得分:-3)

此代码最多可帮助170!。使用double作为阶乘函数,因为普通的int或long int不支持该阶乘结果,double将支持最多1.7e308

#include<stdio.h>

double fact(int k){
    int i;
    double f=1;
    for(i=1;i<=k;i++) f=f*i;
    return (f);
}
int main(){
    int i;
    for(i=1;i<=65;i++)
    printf("%d! = %.3lf\n",i,fact(i));
    return 0;
}