首页 > 其他 > 详细

大数的阶乘

时间:2015-11-07 23:07:40      阅读:336      评论:0      收藏:0      [点我收藏+]

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

 

大数的阶乘

原文:http://www.cnblogs.com/wintersong/p/4946297.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!