#include<stdio.h>
int main()
{
int a[10000];
int n,len;
int i,j,digit,carry,t;
while(scanf("%d",&n)&&n!=0)
{
len=1;
a[0]=1;
digit=1;
carry=0;
for(i=2;i<=n;i++)
{
for(j=0;j<digit;j++)
{
t=a[j]*i+carry;
a[j]=t%10;
carry=t/10;//斩除一位
}
while(carry)
{
a[digit++]=carry%10;//保留一位
carry/=10;//再斩
len++;
}
}
for(i=digit-1;i>=0;i--)
printf("%d",a[i]);
putchar('\n');
printf("len=%d\n",len);
}
return 0;
}
原理:第一;n!= (n-1) ! * n
第二:将前面所得阶乘存入数组, a[0]中存入个位,a[1]十位,以此类推
第三:数组乘以某个数的计算方法为,从a[0]开始,依次乘以该数,大于十则进位
列如:5!=120 (首先a[0]=1,carry=0)
第一次循环:2!,t=a[0]*2+carry=2,a[0]=t %10 =2 ; carry=0.
第二次循环:3! ,t=a[0] * 3+carry = 6, a[0]=t % 10 =6 ,carry=0.
第三次循环:4!,t= a[0]*4+carry=24, a[0]=t%10=4 (即个位,carry=t/10=2,然后进入while,a[1]=carry/10=2;digif变为2;carry/10=0
第四次循环:5!,t=a[0]*5+carry=20,a[0]=t%10=0,carry=t / 10=2
接着 t=a[1] *5+carry=2 * 5+2=12;a[1]=t %10 =2;carry =t / 10=1;
最后进入while,a[2]=carry %10 =1,carry=carry /10=0,结束!
最后将数组倒着输出!完毕!!!