解题思路:

注意事项:

参考代码:

//两种方法,但具体本质都未变,

// 方法1先整体乘2,不管是否进位

#include<stdio.h>

int a[100010];//数组是否初始化为0无影响,因为每次都是令a[1]为1并开始乘法

int main()

{

    int n,len=1;//len记录当前数的长度,如128,长度为3,包含1,2,8

    scanf("%d",&n);

    a[1]=1;

    for(int i=0;i<n;i++)//第一层for循环为乘2的次数

    {

        for(int i=1;i<=len;i++)//这层for循环遍历数的每一位,先保存结果

        a[i]=a[i] * 2;

        for(int i=1;i<=len;i++)//该层for循环用来判断保存的结果是否超过10,同时

        //该层for循环必须不能超出最外层的for循环,否则进位结果不能及时判断

        if(a[i] > 9)

        {

            a[i+1] += a[i] /10;//如16中的第二位变成2后,该操作使得2+1=3

            a[i] = a[i] % 10;

            if(i == len )//是否进位的判断条件

            len++;

        }

    }

    for(int i=len;i>=1;i--)//依次输出

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

    return 0;

}


//2.

#include<stdio.h>

int a[1000010];

int main()

{

    int n,len=1;

    scanf("%d",&n);

    a[1]=1;

    for(int i=1;i<=n;i++)

    {

        int x= 0;//这里定义x=0;保证下面每个整数过程x的不变性

        for(int j=1;j<=len;j++)

        {

            a[j] = a[j] * 2 + x;//该方法通过x在0和1之间的变化来判断是否进位

            x = a[j] / 10;

            a[j] = a[j] % 10;

            if(x != 0 & j == len)

            len ++;

        }

    }

    for(int i=len;i >= 1;i--)

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

    return 0;

}


点赞(0)
 

0.0分

0 人评分

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

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

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

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

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

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

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

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

评论列表 共有 3 条评论

不才 1年前 回复TA
len只是初始化为1,后面根据对应位置的数相乘后是否进位来判断是否len++
洛顾劢 1年前 回复TA
方法2里  a[j] = a[j] * 2 + x;当j=2时, a[2] = a[2] * 2 + x,a[2]的值怎么来的,不太明白
洛顾劢 1年前 回复TA
方法1中len的值定死为1了,为什么循环还能实现