解题思路:
根据题意分为奇数和偶数进行讨论。
偶数时在二进制中表现为最后一位为0,遇到偶数/2,相当于右移一位,也就是说原来的倒数第二位变为最后一位,即len--,sum++。
奇数时在二进制中表现为最后一位为1,遇到奇数加1,即从最后一位往前只要是1都变为0,遇到0就变为1,因为变为0之后又会变成偶数的情况,这里为了减少循环次数,直接做了右移处理,即len--,sum++。
代码:
#include<bits/stdc++.h>
using namespace std;
int main(){
char s[105];
scanf("%s",s);
int len=strlen(s)-1;
int sum=0;
while(len){
if(s[len]=='0'){
sum++;
len--;
}
else{
sum++;//奇数要+1,所以sum+1
while(s[len]=='1'){
sum++;
len--;
}
if(len<0) break;
if(len) s[len]='1';
//else sum++;有前导0的情况
}
}
printf("%d\n",sum);
return 0;
}