私信TA

用户名:1678463512

访问量:7814

签 名:

等  级
排  名 2793
经  验 2159
参赛次数 0
文章发表 20
年  龄 20
在职情况 待业
学  校 秋长中学
专  业

  自我简介:

解题思路:

    1977!的值不超过一万位,用一个含有10000个元素的整型数组x存放结果

    每个元素存放一位,x[0]存放个位数字,x[1]存放十位数字,以此类推,

    假如8!计算出来的值40320放在x中,......4   3   2   1   0 --数组元素下标

                                                               ... 4   0   3    2   0 --存放的值

    当前数组长度len=4,求9!时,将j=9与数组中每个元素依次相乘,rem保存当前进位数字

    过程:1, rem赋初值0

              2, i=0: rem=rem+x[0]*9=0+0=0;x[0]=rem%10=0;rem=rem/10=0;

              3, i=1: rem=rem+x[1]*9=0+18=18;x[1]=rem%10=8;rem=rem/10=1;

              4, i=2: rem=rem+x[2]*9=1+27=28;x[2]=rem%10=8;rem=rem/10=2;

              5, i=3: rem=rem+x[3]*9=2+0=2;x[3]=rem%10=2;rem=rem/10=0;

              6, i=4: rem=rem+x[4]*9=0+36=36;x[4]=rem%10=6;rem=rem/10=3;

              7, rem=3; len=len+1=5; x[5]=rem%10=3; rem=rem/10=0;结束

         x的各位结果为3,6,2,8,8,0, 9!=362880

注意事项:

参考代码:

int x[10000];

    int i,j,rem = 0,len = 0;

    //rem是保存当前进位数字,len是数组长度

    x[0] = 1;

    for(j = 2;j <= 1977;j++)

    {

        for(i = 0;i <= len;i++)

        {

            rem = rem + x[i] * j;

            x[i] = rem % 10;

            rem /= 10;


        }


        if( rem != 0)

            {

                x[i] = rem % 10;

                rem /= 10;

                len++;

                //这里因为随着数据增大,rem有可能不止进一位数的位,rem可能为2位数

                //所以加个循环,注意,赋值不要重复了,所以是x[++i]

                while(rem != 0)

                {

                    x[++i] = rem % 10;

                rem /= 10;

                len++;

                }

            }


    }

    for(i = len;i >= 0;i--)

    {

        printf("%d",x[i]);

    }




 

0.0分

0 人评分

新上线《蓝桥杯辅导》课程,近五年的蓝桥杯省赛与国赛真题都有,从读题开始理解题意、梳理思路、实现代码再提交评测全过程,可有效提升获奖比例甚至进国赛!课程介绍、试听请猛击这里

  评论区

  • «
  • »