大数的阶乘

首先要确定这个数的阶乘需要开多大的数组,可以用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;
}

 

posted @ 2015-11-07 22:59  咸咸的告别  阅读(300)  评论(0编辑  收藏  举报