码迷,mamicode.com
首页 > 其他好文 > 详细

大数的阶乘

时间:2015-11-07 23:09:09      阅读:236      评论: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
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!