First Message. Here is a part of my program. You can calculate 10000!, maybe more.
I am cutting code.

#define Max_Digit 20000 // May be changed by memory
#define Base 10 // 256 is confortable
struct GreatNumber{
public:
int digits[Max_Digit];
int decflag;
int positionflag;
}stemp,sptemp,temp2;

GreatNumber Mult(GreatNumber X, GreatNumber Y)
//Spider-Multiplication of numbers By:Slayerchange
{
int log1=0,log2=0,log3=0,log4=0,artik=0,deger=0;
log2=Y.positionflag+1;
log4=X.positionflag+1;
NullNumber(sptemp);
NullNumber(temp2);
for(log1=0;log1<=log2;log1++)
{
for(log3=0;log3<=log4;log3++)
{
deger=Y.digits[log1]*X.digits[log3]+artik;
if(sptemp.digits[log1+log3]+deger<Base){
sptemp.digits[log1+log3]+=deger;
artik=0;
deger=0;}
else{
deger+=sptemp.digits[log1+log3];
sptemp.digits[log1+log3]=deger%Base;
artik=(deger-deger%Base)/Base;
}
}
SetPosition(sptemp);
temp2=sum(temp2,sptemp);
NullNumber(sptemp);
}
return temp2;
}
//Some functions here irrevelent.You can delete them. Here is fakto.
void Fakto1000(void)
//1000!
{
GreatNumber A,B,C;
NullNumber(A);
NullNumber(B);
NullNumber(C);
A.digits[5]=1;
B.digits[0]=1;
C.digits[0]=1;
SetPosition(A);
SetPosition(B);
SetPosition(C);
do{
Inc(B,0,1);
C=Mult(C,B);
shownumber(B);
cout<<"\nFakto=";
shownumber(C);
}while(!Equal(A,B));
}