Codeforces Round #581 (Div. 2)

邮差的信 提交于 2019-11-28 06:23:23

A

按照案例是把二进制转换为十进制,让后计算4^k小于这个十进制,那么k的值就是答案,但是二进制的长度达到了100位,也就意味这最大值可以是2^99,但是如果用十进制的话,存不了那么大的数据,所以要用二进制转换为四进制
然后判断一些特殊值
比如010,奇数位的,补0
比如转换为四进制后为1000的,答案是3而不是4,因为该值刚好是4的幂方
再者,在补0时需要反向存储二进制

#include <iostream>
#include <cstdio>
#include <cstring>
#define ll long long 
using namespace std;
int main(){
    char a[105];
    char s[105];
    char c[105];
    int cnt=0;

    scanf("%s",a+1);
    int len=strlen(a+1);
    for(int i=1;i<=len;i++){
        s[i]=a[len+1-i];
    }
    if(len%2!=0){
        s[len+1]='0';
        len++;
    }

    for(int i=1;i<=len;i+=2){
        if(s[i]=='0'&&s[i+1]=='0'){
            c[cnt++]='0';
        }else if(s[i]=='1'&&s[i+1]=='0'){
            c[cnt++]='1';
        }else if(s[i]=='0'&&s[i+1]=='1'){
            c[cnt++]='2';
        }else if(s[i]=='1'&&s[i+1]=='1'){
            c[cnt++]='3';
        }
    }
    int allone=0;
    for(int i=0;i<cnt;i++){
        if(c[i]>='1'){
            allone++;
        }
    }

    for(int i=0;i<cnt;i++){
        int sum=0;//1的个数
        for(int j=i;j<cnt;j++){
            if(c[j]>='1')sum++;
        }
        if(sum==0){
            cnt=i;
            break;
        }
    }
    if(allone==1&&c[cnt-1]=='1'){
        cnt--;
    }else if(c[cnt-1]=='0'){
        cnt--;
    }

    printf("%d\n",cnt);

    return 0;
}
标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!