不才


私信TA

用户名:983

访问量:1815

签 名:

等  级
排  名 772
经  验 3763
参赛次数 1
文章发表 6
年  龄 0
在职情况 学生
学  校
专  业

  自我简介:

解题思路:

注意事项:

参考代码:

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

// 方法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 人评分

  评论区

len只是初始化为1,后面根据对应位置的数相乘后是否进位来判断是否len++
2023-04-03 20:51:50
方法2里  a[j] = a[j] * 2 + x;当j=2时, a[2] = a[2] * 2 + x,a[2]的值怎么来的,不太明白
2023-04-02 20:17:54
方法1中len的值定死为1了,为什么循环还能实现
2023-04-02 17:27:55
  • «
  • 1
  • »