解题思路:
灵感来源于n个数相乘最右侧的数是什么?这个题目
首先我们要是直接使用阶乘的结果来进行判断的话int类型在13!时失败,最大的float类型在35!时失败,因而我们想要通过正常算的方法来得到所有结果是不可能的。
之后我便想到了那个灵感。我每次都让s保存上一个数的最右侧非零数再乘上当前的这个i怎么样?结果在前14个阶乘都是正确的s=2,但当i=15时s*15=30,此时我们新取的最右端非零数结果为3,而
14! 87,178,291,200
15! 1,307,674,368,000
即正确结果为8。
后来我又观察到要是我让s在i=14时保存的是最后两位非零数呢?然后从14到15的时候s*15=12*15=180后再对180取最右端非零数,结果便正确了。
但只取两位也不能全对,因为第24次进行运算的时候得到的s=96,后来第25次进行运算s*25%100=96*25%100=2400%100=0后面再怎么乘结果都是0因而w保存的数也不会更新始终保留在24次时的6。问题就找到了。具体原因就是因为某次的数字乘上新的i得到的数字后面携带的0超过了判断的位数。判断的位数越多越好。(s每次取三位数的时候在i=125时s变为0、s取四位时在i=625处s变为0)本体只需要取三位数即可满足0~100的题目要求。
注意事项:
参考代码:
#include<stdio.h> int main() { int i,s=1,n,sp,w; scanf("%d",&n); for(i=2;i<=n;i++) { s=s*i%10000; //printf("第%d次:%d\n",i,s);//这里可以用来查看取两位数 三位数 还是四位数的区别。 sp=s; while(sp) { w=sp%10; if(w!=0) { s=sp; break; } sp/=10; } } printf("%d",w); }
0.0分
2 人评分
C语言网提供由在职研发工程师或ACM蓝桥杯竞赛优秀选手录制的视频教程,并配有习题和答疑,点击了解:
一点编程也不会写的:零基础C语言学练课程
解决困扰你多年的C语言疑难杂症特性的C语言进阶课程
从零到写出一个爬虫的Python编程课程
只会语法写不出代码?手把手带你写100个编程真题的编程百练课程
信息学奥赛或C++选手的 必学C++课程
蓝桥杯ACM、信息学奥赛的必学课程:算法竞赛课入门课程
手把手讲解近五年真题的蓝桥杯辅导课程
发表评论 取消回复