大数。不过这道题的数真的大得很可怕,大到一段时间内一直怀疑是不是自己算法错了。
代码如下:
#include<cstdio>
#include<cstring>
long long a[2701]; //10000!至少有30000+几千位,每个数组元素存储14位的数字
int main()
{
int n,i,j;
int start,first,pre;
long long mod=1;
for(i=1;i<=14;i++)
mod*=10;
while(~scanf("%d",&n))
{
if(n==0) printf("1\n");
else
{
memset(a,0,sizeof(a));
a[2700]=1;
for(i=1;i<=n;i++) //大数乘法
{
for(j=2700;j>=0;j--) //每个数位上的数字都乘以这个数
a[j]*=i;
for(j=2700;j>=0;j--) //乘完后再取余
{
if(a[j]>=mod)
{
a[j-1]=a[j-1]+a[j]/mod;
a[j]%=mod;
}
}
}
start=0;first=1;
for(i=0;i<=2700;i++)
{
if(a[i]!=0)
start=1;
if(start)
{
if(first)
{
first=0;
printf("%lld",a[i]);
}
else printf("%014lld",a[i]);
}
}
printf("\n");
}
}
return 0;
}