解题思路:
    灵感来源于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.0分

2 人评分

C语言网提供由在职研发工程师或ACM蓝桥杯竞赛优秀选手录制的视频教程,并配有习题和答疑,点击了解:

一点编程也不会写的:零基础C语言学练课程

解决困扰你多年的C语言疑难杂症特性的C语言进阶课程

从零到写出一个爬虫的Python编程课程

只会语法写不出代码?手把手带你写100个编程真题的编程百练课程

信息学奥赛或C++选手的 必学C++课程

蓝桥杯ACM、信息学奥赛的必学课程:算法竞赛课入门课程

手把手讲解近五年真题的蓝桥杯辅导课程

评论列表 共有 0 条评论

暂无评论