杭电oj1042 N!

版权声明:版权声明:本文为博主原创文章,博客地址:http://blog.csdn.net/weixin_41969587,未经博主允许不得转载。 https://blog.csdn.net/weixin_41969587/article/details/82561661

这里写图片描述

#include<iostream>
#include<string>
#include<algorithm>
using namespace std;
int jia(int r[]){//自增1函数 
    int t;
    r[0]=r[0]+1;
    for(int i=0;i<5;i++){//把数存进数组里面 
        if(r[i]>=10)//例如1234,r[0]=4,r[1]=3,r[2]=2,r[3]=1 
        r[i+1]=r[i+1]+1;//s[],m[]数组也是这样 
        r[i]=r[i]%10;
    }
    for(int i=4;i>=0;i--)
    if(r[i]!=0)
    {
        t=i;
        break;
    }
    return t;//存储该数的有效计算长度下标 
}
void cheng(int m[],int &m1,int n[],int n1,int s[]){//m1、n1分别为两数组有效计算长度的终点下标 
    int i,j;
    for(i=0;i<=m1;i++)//对两个数组进行常规的乘法运算 
    for(j=0;j<=n1;j++){
    s[i+j]+=m[i]*n[j];
}
    for(i=0;i<=(m1+n1);i++)//进行进位处理 
    if(s[i]>=10){
        s[i+1]+=s[i]/10;
        s[i]=s[i]%10;
    }//s[]存储乘法后的计算结果 
    if(s[m1+n1+1]>0)//判断是否最后一位需要进位 
    m1=m1+n1+1; 
    else
    m1=m1+n1;
    for(i=0;i<=m1;i++)//把s[]复制给m[] 
    m[i]=s[i];
}
int main(){
    int N; 
    while(cin>>N){
        if(N==0)//若N=0时,N!=1 
        cout<<1<<endl;
        else{
    int m[40000]={0},r[5]={0},s[40000],m1,t;
    m[0]=1;m1=0;//辅助数组s[],存储结果数组m[] 
    for(int i=0;i<N;i++)//乘法的次数 
    {
    for(int j=0;j<39999;j++)//s[]初始化 
    s[j]=0;
    t=jia(r);
    cheng(m,m1,r,t,s);
    }
    for(int i=m1;i>=0;i--)
    cout<<s[i];
    cout<<endl;
    }
}
    return 0;
}

上面的代码可以AC!不过我是初学者,算法有点水,跑的时间有点长!

如果上面代码有什么错误,欢迎大家指点出来!

注意:10000的阶乘有36000多位数,所以大家的数组至少要开大于这个数字的!

猜你喜欢

转载自blog.csdn.net/weixin_41969587/article/details/82561661
今日推荐