大数的阶乘
首先要确定这个数的阶乘需要开多大的数组,可以用Stirling公式。
输入不超过10000的正整数,计算n!的具体值。
#include<iostream> #include<math.h> using namespace std; const int maxn=50000; int main(){ int n,s,k,c; int f[maxn+1]; while (cin>>n) { memset(f,0,sizeof(f)); f[0]=1; for(int i=1;i<=n;i++){ c=0; for(int j=0;j<=maxn;j++){ s=f[j]*i+c; c=s/10; f[j]=s%10; } } for(k=maxn;k>=0;k--) if(f[k]!=0) break; for(int j=k;j>=0;j--) cout<<f[j]; cout<<endl; } return 0; }
我们发现f[i]里面只有1个数字,但是f[i]是int型的,能存9位数,这样不仅速度加快,开销也减小很多。
#include<iostream> #include<iomanip> using namespace std; const int maxn=20000; int main(){ int n,s,k,c; int f[maxn+1]; while (cin>>n) { memset(f,0,sizeof(f)); f[0]=1; for(int i=1;i<=n;i++){ c=0; for(int j=0;j<=maxn;j++){ s=f[j]*i+c; f[j]=s%100000; c=s/100000; } } for(k=maxn;k>=0;k--) if(f[k]!=0) break; cout<<f[k]; for(int j=k-1;j>=0;j--){ cout<<setw(5)<<setfill('0')<<f[j]; } cout<<endl; } return 0; }