邱浩宇


私信TA

用户名:uq_51612810454

访问量:729

签 名:

等  级
排  名 24277
经  验 618
参赛次数 1
文章发表 3
年  龄 19
在职情况 学生
学  校 宿迁学院
专  业 信息与计算科学

  自我简介:

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

  评论区

  • «
  • »