高位阶乘计算

输入不超过1000的正整数n,输出n!=1x2x3......xn的精确结果

输入:30

输出:265252859812191058636308480000000


分析:

1.平常用迭代计算阶乘,不能计算高位阶乘,因为会超过int值的范围,long long也不能满足;

2.因此要手动模拟计算,依次模拟计算1x2,1x2x3......1x2x3...n

3.用一个高维数组fact[MAX]存储阶乘值,且低位依次存储,即:fact[0]存储个位,fact[1]存储十位......这样可以方便进位处理;

4.进位处理过程:假设fact存储值依次为:fact[0], fact[1], fact[2]...fact[k](fact[0]为个位,fact[1]为十位....),此时乘数是i,即乘以i; 从fact[0]到fact[k]依次处理:

   假设buf=fact[j]*i+ans(其中ans为前一位的进位,初始为0),则当前fact[j]=buf%10;向高位进位为ans=buf/10。


#include<iostream>
#include<cstring>
#define MAX 5000
using namespace std;

int fact[MAX];
int main()
{
    int n;
    while(cin>>n)
    {
        memset(fact,0,sizeof(fact));
        fact[0]=1;
        int ans=0;
        for(int i=2;i<=n;i++){
            for(int j=0;j<MAX;j++){
                int buf=fact[j]*i+ans;
                fact[j]=buf%10;
                ans=buf/10;
            }
        }
        int pos;
        for(pos=MAX-1;pos>=0;pos--) if(fact[pos]) break;
        for(int i=pos;i>=0;i--) cout<<fact[i];
        cout<<endl;
    }
	return 0;
}



评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值