您的位置:首页 > 其它

大数的阶乘

2015-11-07 22:59 176 查看
首先要确定这个数的阶乘需要开多大的数组,可以用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;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: