解题思路:用数组来代表所求数的每一位(本题所求数远远大于long long的规定范围),如a[0]代表个位,a[1]代表十位,a[2]代表百位,以此类推;一个数的乘算可以拆分为他每一位数的成算,这是需要理解的点

注意事项:我的解法中一开始忽略了第一次的值1,后来发现懒得改了,也可以把(总值=总值+单个数)放在单个数*2前面,然后循环64次

参考代码:

#include<stdio.h>

int main()

{

    int i,s,j;

    int a[30],b[30];//a记录单个值,b记录总值

    for(i=0;i<30;i++)//赋值初值都为0 

    {

         a[i]=0;b[i]=0;

     }

         a[0]=1;

for(i=1;i<64;i++)//以下过程循环63次 

{

      for(j=0;j<25;j++)

     {

            a[j]=a[j]*2;//单个值的每一位都乘以2 

     }

     for(j=0;j<25;j++)//单个值进位 

     {

            if(a[j]>=10)//此处可用if,因为个位数*2不会超出20,若是*3之类的需要用while,这点需要注意

          {

            a[j]=a[j]-10;

             a[j+1]++;

           }

      }

         for(j=0;j<30;j++)//当前总值每一位加上单个值 

       {

             b[j]=b[j]+a[j];

        }

}

           for(j=0;j<30;j++)//总值进位 (只需做一次,不用放循环内部,徒增运行时间)

                 {

                         while(b[j]>=10)

                              {

                                    b[j]=b[j]-10;

                                    b[j+1]++;

                              }

                    }

  for(i=29;i>=0;i--)//输出答案 

    {

                 if(b[i]!=0)

           {

                        for(j=i;j>=1;j--)

                  {

                   printf("%d",b[j]);

                   }

              printf("%d",b[0]+1);//输出的个位数应加上循环中未考虑的第一次值为1 

              return 0;

             }

}

    return 0;

}


点赞(0)
 

0.0分

0 人评分

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

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

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

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

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

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

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

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

评论列表 共有 0 条评论

暂无评论