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;
}