1612:计算2的N次方

发布时间 2023-12-10 11:19:58作者: Qwehhh

这是一道喜闻乐见的高精度题

首先错误代码

#include<bits/stdc++.h>
using namespace std;
int main()
{
    int a[10001];
    memset(a,0,sizeof(a));
    a[1] = 1;
    int n,m,s,t = 0,len = 0;
    scanf("%d",&n);
    for(int i = 1;i <= n;i++){
        for(int j = 1;a[j] != 0;j++){
            a[j] *= 2;
        }
        for(int j = 1;a[j] != 0;j++){
            if(a[j] >= 10){
                t = a[j] / 10;
                a[j] %= 10;
                a[j+1] += t;
            }
        }
    }
    for(int i = 1;a[i] != 0;i ++){
        len ++;
    }
    for(int i = len;i >= 1;i --){
        printf("%d",a[i]);
    }
    return 0;
}

这里是忽略了“1024”这样数中间有0的情况,所以不能用0来判定整个数的位置

改正

#include<bits/stdc++.h>
using namespace std;
int main()
{
    int a[10001];
    memset(a,0,sizeof(a));
    a[1] = 1;
    int n,t = 0,len = 1;
    scanf("%d",&n);
    for(int i = 1;i <= n;i++){
        for(int j = 1;j <= len;j++){
            a[j] *= 2;
        }
        for(int j = 1;j <= len;j++){
            if(a[j] >= 10 && j == len){
                len ++;
            }            
            if(a[j] >= 10){
                t = a[j] / 10;
                a[j] %= 10;
                a[j+1] += t;
            }
        }
    }
    for(int i = len;i >= 1;i --){
        printf("%d",a[i]);
    }
    return 0;
}

这里引入一个len变量记录数的长度,如果碰到需要进位并且碰到数的边界了就给len+1