解题思路:
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]);
}
0.0分
0 人评分
C语言网提供由在职研发工程师或ACM蓝桥杯竞赛优秀选手录制的视频教程,并配有习题和答疑,点击了解:
一点编程也不会写的:零基础C语言学练课程
解决困扰你多年的C语言疑难杂症特性的C语言进阶课程
从零到写出一个爬虫的Python编程课程
只会语法写不出代码?手把手带你写100个编程真题的编程百练课程
信息学奥赛或C++选手的 必学C++课程
蓝桥杯ACM、信息学奥赛的必学课程:算法竞赛课入门课程
手把手讲解近五年真题的蓝桥杯辅导课程
发表评论 取消回复