原题链接:C语言训练-计算1977!*
解题思路:
大数据阶乘,我们用数组存储结果,这题用长度为5660的数组 jc[5660] 刚好够存1977的阶乘;
1:定义变量weishu代表阶乘的结果所占的位数;
2:把整个数组(jc[])全赋值为0,再把0号元素(jc[0])置1,代表此时阶乘的值为1!,同时,weishu=1;
3:让数组依次乘i=2,3,4........1977 ,依次得到2!, 3!,4!.........1977!
具体乘法:
和我们数学乘法竖式一样的思路
让阶乘中每一位(0~weishu-1)都乘i,与我们手算不同的是,这里不先不进位,我们手算是乘一个进位一次;
乘完后,开始进位,
jc[j+1]+=jc[j]/10; jc[j]%=10;
(我们这里是把个位数存在0号位置,所以进位向后面进)
在进位的过程中,要更新weishu的值,因为在进位后阶乘结果位数改变;
if(jc[j]/10&&(j==weishu-1)) 这个代码的意思就是,阶乘结果的最高(j==weishu-1代表最高位)位有进位 weishu++; 则,阶乘结果位数加一位
进位结束后,整个数组jc[]里面有效位就是i的阶乘了,接着乘以i+1,重复上面过程就得到了i+1的阶乘..最后直1977!
注意事项:
0号元素对应为阶乘结果的个位数,输出结果时,倒着输出;
参考代码:
#include <stdio.h> int jc[5660] = { 0 }; int weishu = 1; void function( int i ); /*-------------------------------------------------------*/ int main() { jc[0] = 1; for ( int i = 2; i <= 1977; i++ ) function( i ); for ( int i = weishu - 1; i >= 0; i-- ) printf( "%d", jc[i] ); return(0); } /*-------------------------------------------------------*/ void function( int i ) { int jinwei; for ( int j = 0; j < weishu; j++ ) jc[j] *= i; for ( int j = 0; j < weishu; j++ ) { if ( jc[j] / 10 && (j == weishu - 1) ) weishu++; jc[j + 1] += jc[j] / 10; jc[j] %= 10; } }
别忘点赞喏-.-
0.0分
43 人评分
C语言网提供由在职研发工程师或ACM蓝桥杯竞赛优秀选手录制的视频教程,并配有习题和答疑,点击了解:
一点编程也不会写的:零基础C语言学练课程
解决困扰你多年的C语言疑难杂症特性的C语言进阶课程
从零到写出一个爬虫的Python编程课程
只会语法写不出代码?手把手带你写100个编程真题的编程百练课程
信息学奥赛或C++选手的 必学C++课程
蓝桥杯ACM、信息学奥赛的必学课程:算法竞赛课入门课程
手把手讲解近五年真题的蓝桥杯辅导课程
发表评论 取消回复