首先确定阶乘的位数。
我们知道整数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,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; }