#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多位数,所以大家的数组至少要开大于这个数字的!