#include
int main()
{
long int n;
long int a[250000]; //确保保存最终运算结果的数组足够大
long int digit = 1; //结果的位数
long int temp; //阶乘的任一元素与临时结果的某位的乘积结果
long int i,j,carry; //i:1~n的某一阶乘元素;carry:进位
printf("please in put n:\n");
scanf("%d",&n);
a[0] = 1; //将结果先初始化为1
for(i = 2; i <= n; i++)
{ //开始阶乘,阶乘元素从2开始依次"登场"
//按最基本的乘法运算思想来考虑,将阶乘元素i与临时结果的每位a[j-1]相乘
for( j = 0, carry = 0; j < digit; j++)
{
temp = i * a[j] + carry; //相应阶乘中的一项i与当前所得临时结果的从低到高各位a[j-1]依次相乘(加上进位)
a[j] = temp % 10; //更新临时结果的位上信息
carry = temp / 10; //更新相乘后的进位
}
while(carry) //如果有进位
{
++digit; //新加一位,添加信息。位数增1
a[digit-1] = carry % 10; //将进位放在新加的结果位上
carry = carry/10; //看还能不能进位
}
}
printf("n ! = "); //输出结果
for(j = digit; j >=1;j--)
{
printf("%d",a[j-1]);
}
printf("\n%d",digit);
return 0;
}