//下面是求10000的阶乘
#include <stdio.h>
typedef struct BigNum_
{
int data[10000];
int n;
} BigNum;
BigNum* carry(BigNum* bn, int curr, int valid, int inc)
{
return curr>=valid && inc ? (++bn->n,
bn->data[curr] = inc%10000, carry(bn, curr+1, valid, inc/10000)) : bn;
}
BigNum* mul(BigNum* bn, int n, int curr, int valid, int inc)
{
int t = inc+bn->data[curr]*n;
return curr >= valid ?
carry(bn, curr, valid, inc) :
(bn->data[curr]=t%10000, mul(bn, n, curr+1, valid, t/10000));
}
BigNum* power(BigNum* bn, int n, int p)
{
return --p ? (power(bn, n, p), mul(bn, n, 0, bn->n, 0)) :
(bn->n=1, bn->data[0] = n, bn);
}
BigNum* fac(BigNum* bn, int n)
{
return n ? (fac(bn, n-1), mul(bn, n, 0, bn->n, 0)): (bn->n=1, bn->data[0] = 1, bn);
}
void show(BigNum* bn, int curr)
{
if (curr != bn->n)
{
show(bn, curr+1);
curr == bn->n -1 ? printf("%d", bn->data[curr]) :
printf("%04d", bn->data[curr]);
!curr ? puts("") : 0;
}
}
BigNum n;
int main(int argc, char* argv[])
{
show(fac(&n, 10000), 0);
return 0;
}