#include <stdio.h>
#include <string.h>
#define MAX 20000
int fac(int n,char value[],int m)//计算n的阶层
{
int carry = 0;
int r;
int valueLen = 1, index = 0;//valueLen为结果的长度
int i, j;
//初始化value数组
value[0] = '1';
for (i = 1; i < m; i++)
{
value[i] = '0';
}
for(i = 1; i <= n; i++)
{
index = 0;
for(j = 0; j < valueLen; j++)
{
r = (value[index] - '0')*i + carry;
value[index] = r % 10 + '0';
carry = r / 10; //进位
index++;
if(carry > 0 && index == valueLen)//最高位有进位才能将长度加1
{
valueLen++;
}
}
}
return valueLen;
}
void add(char *num1, char *num2)//大数相加
{
int iLen1;
int iLen2;
int iTemp = 0;
int i;
iLen1 = strlen(num1);
iLen2 = strlen(num2);
memmove(num1+(100-iLen1), num1, iLen1);
memset(num1, '0', 100-iLen1);
memmove(num2+(100-iLen2), num2, iLen2);
memset(num2, '0', 100-iLen2);
for(i=99;i>=0; i--)
{
iTemp = (num1[i] - '0' + num2[i] - '0') + iTemp;
num1[i] = (iTemp%10) + '0';
iTemp = iTemp/10;
}
for(i=0; i<100; i++)
{
if(num1[i] != '0')break;
}
memmove(num1, num1+i, 100 - i);
num1[100 - i] = '\0';
}
int test(char *num1)
{
int iLen;
int i;
iLen = strlen(num1) -1;
for(i=0; i<=iLen; i++)
{
if(num1[i] != num1[iLen-i])
{
return 1;
}
}
return 0;
}
int main()
{
char value[MAX];
char sum[MAX];
sum[0] = '1';
for (int ti = 1; ti < MAX; ti++)
{
sum[ti] = '0';
}
int n=0;
printf("Please input a factorial numble:");
scanf("%d",&n);
int valueLen=fac(n,value,MAX);
for(int i =valueLen-1; i >= 0; i--)
{
printf("%c",value[i]);
}
printf("\n");
return 0;
}