解题思路:

    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]);

    }




点赞(1)
 

0.0分

0 人评分

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

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

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

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

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

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

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

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

评论列表 共有 0 条评论

暂无评论