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