要代码的封装性=> 牺牲了效率 :(
/*
* 第一次用模板写高精度
*/
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#include<assert.h>
#define BASE 10000
#define WIDTH 4
#define MAXLEN 50000
typedef struct _lnum
{
long num[MAXLEN];
int len;
}lnum;
int clear(lnum *e)
{
int i;
for(i=0;i<MAXLEN;i++)
e->num[i]=0;
e->len=1;
return 0;
}
int assign(lnum* num,long e)
{
int clear(lnum*);
int len=0;
clear(num);
while(e)
{
num->num[++len]=e%BASE;
e/=BASE;
}
num->len=len;
return 0;
}
int mul(lnum* num1,lnum* num2,lnum* ans)
{
int len1=num1->len;
int len2=num2->len;
int i,j;
lnum res;
clear(&res);
for(i=1;i<=len1;i++)
for(j=1;j<=len2;j++)
res.num[i+j-1]=num1->num[i]*num2->num[j];
for(i=1;i<=len1+len2;i++)
{
res.num[i+1]+=res.num[i]/BASE;
res.num[i]%=BASE;
}
if(res.num[len1+len2]>0)
res.len=len1+len2;
else
res.len=len1+len2-1;
for(i=0;i<=res.len;i++)
ans->num[i]=res.num[i];
ans->len=res.len;
return 0;
}
int print(lnum* e)
{
int i;
printf("%ld",e->num[e->len]);
for(i=e->len-1;i>=1;i--)
printf("%0*ld",WIDTH,e->num[i]);
return 0;
}
int main(void)
{
lnum s,ans;
long n;
while(scanf("%ld",&n)!=EOF)
{
if(n==0)
{
puts("1");
continue;
}
assign(&ans,n);
while(--n>=1)
{
assign(&s,n);
mul(&s,&ans,&ans);
}
print(&ans);
putchar('\n');
}
return 0;
}