H2330819033


私信TA

用户名:dotcpp0705980

访问量:122

签 名:

等  级
排  名 652
经  验 4048
参赛次数 0
文章发表 1
年  龄 0
在职情况 学生
学  校 贺州学院
专  业

  自我简介:

TA的其他文章

解题思路:用数组来代表所求数的每一位(本题所求数远远大于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 人评分

  评论区

  • «
  • »