初略估计10000!的阶乘会有将近3000位数。
用二维数组每个单元保存一位数最后会内存溢出,所以我们每个单元保存4位数,减少数组的大小。
注意输出时的细节,每个单元保存4位数,如果数是0的话,要以%04输出。
#include<stdio.h>
using namespace std;
#define M 10001
#define N 10001
int a[N][M]={0};
int len[N];
void change()
{
int i,j,l,r,temp;l=1;
a[0][0]=1;len[0]=1;
for(i=1;i<N;i++)
{
for(j=0;j<l;j++)
{
a[i][j]=a[i-1][j]*i;
}r=0;
for(j=0;j<l;j++)
{
temp=a[i][j]+r;
a[i][j]=temp%10000;
r=temp/10000;
}
while(r)
{
a[i][l++]=r%10000;
r=r/10000;
}
len[i]=l;
}
}
int main()
{
int n,i;
change();
while(~scanf("%d",&n))
{
if(len[n]==1) printf("%d\n",a[n][0]);
else{
printf("%d",a[n][len[n]-1]);
for(i=len[n]-2;i>=0;i--)
printf("%04d",a[n][i]);
printf("\n");
}
}
return 0;
}