您的位置:首页 > 其它

阶乘的精确值(大数)

2016-09-07 11:01 302 查看
首先确定阶乘的位数。

我们知道整数n的位数的计算方法为:log10(n)+1

故n!的位数为log10(n!)+1

 

如果要求出n!的具体值,对很大的n(例如n=1000000)来说,计算会很慢,如果仅仅是求阶乘的位数,可以用斯特林(Stirling)公式求解

 斯特林(Stirling)公式:



于是求n!的位数就是求log10((2*PI*n)^1/2*(n/e)^n)+1

即  1/2*log10(2*PI*n)+n*log10(n/e)+1

 

所以采用下面代码计算阶乘位数,会非常快
#include <math.h>
#define PI 3.141592654
#define E 2.71828182846
int l(int n)
{
int s=1;
if(n>3)
s=log10(2*PI*n)/2+n*log10(n/E)+1;
return s;
}
以上转载至http://www.cnblogs.com/stonehat/p/3603267.html
求大整数阶乘
肯定用数组模拟了,于是先用上面的代码测试一下需要求的数的长度。
算了一下1997阶乘的长度大概是5000多,于是我们开一个6000的数组。
然后从1开始像上面模拟阶乘的运算。
用f[0]保存1,f[1] f[2]....依次保存高位。

int main(void){
//cout<<l(1997)<<endl;
int i,j,n;
scanf("%d",&n);
memset(f,0,sizeof(f));
f[0]=1;
for(i=2;i<=n;i++){
int c=0;
for(j=0;j<=maxn-1;j++){ //最多也进位不到maxn位
int s=f[j]*i+c;
f[j]=s%10;//个位保留
c=s/10;//进位
}
}
for(j=maxn-1;j>=0;j--){
if(f[j]){
break; //找到最高位
}
}
for(i=j;i>=0;i--){
printf("%d",f[i]);
}
printf("\n");
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  大数