解题思路:
1977!的值不超过一万位,用一个含有10000个元素的整型数组x存放结果
每个元素存放一位,x[0]存放个位数字,x[1]存放十位数字,以此类推,
假如8!计算出来的值40320放在x中,......4 3 2 1 0 --数组元素下标
... 4 0 3 2 0 --存放的值
当前数组长度len=4,求9!时,将j=9与数组中每个元素依次相乘,rem保存当前进位数字
过程:1, rem赋初值0
2, i=0: rem=rem+x[0]*9=0+0=0;x[0]=rem%10=0;rem=rem/10=0;
3, i=1: rem=rem+x[1]*9=0+18=18;x[1]=rem%10=8;rem=rem/10=1;
4, i=2: rem=rem+x[2]*9=1+27=28;x[2]=rem%10=8;rem=rem/10=2;
5, i=3: rem=rem+x[3]*9=2+0=2;x[3]=rem%10=2;rem=rem/10=0;
6, i=4: rem=rem+x[4]*9=0+36=36;x[4]=rem%10=6;rem=rem/10=3;
7, rem=3; len=len+1=5; x[5]=rem%10=3; rem=rem/10=0;结束
x的各位结果为3,6,2,8,8,0, 9!=362880
注意事项:
参考代码:
int x[10000];
int i,j,rem = 0,len = 0;
//rem是保存当前进位数字,len是数组长度
x[0] = 1;
for(j = 2;j <= 1977;j++)
{
for(i = 0;i <= len;i++)
{
rem = rem + x[i] * j;
x[i] = rem % 10;
rem /= 10;
}
if( rem != 0)
{
x[i] = rem % 10;
rem /= 10;
len++;
//这里因为随着数据增大,rem有可能不止进一位数的位,rem可能为2位数
//所以加个循环,注意,赋值不要重复了,所以是x[++i]
while(rem != 0)
{
x[++i] = rem % 10;
rem /= 10;
len++;
}
}
}
for(i = len;i >= 0;i--)
{
printf("%d",x[i]);
}