解题思路:
灵感来源于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++代码)浏览:1173 |
C语言训练-最大数问题 (C语言代码)浏览:648 |
C语言程序设计教程(第三版)课后习题1.6 (C++代码)浏览:909 |
C语言程序设计教程(第三版)课后习题5.5 (C语言代码)浏览:577 |
C语言程序设计教程(第三版)课后习题1.5 (C语言代码)浏览:644 |
C语言程序设计教程(第三版)课后习题1.5 (C语言代码)浏览:512 |
打印十字图 (C语言代码)浏览:2822 |
C语言程序设计教程(第三版)课后习题5.7 (C语言代码)浏览:569 |
C语言程序设计教程(第三版)课后习题5.5 (C语言代码)浏览:582 |
printf基础练习2 (C语言代码)浏览:547 |