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