3998. 变成1
-
同上一题,自己用了比较繁琐的方法模拟了出来,但是果不其然的超时了。
然后看了别人的解法,将原来题目的处理方式转换成了其他方法。用进制的方式统计操作的次数,而不是原题目的奇偶加减。
但有点无法理解这两个不同的东西是怎么套上去的,太跳跃了有点懵圈。
// 正确代码
#include <bits/stdc++.h>
using namespace std;
int main() {
string str;
cin>>str;
int n = str.size();
int ans = 0;
int jin = 0;
for(int i=n-1;i>0;--i){
int cur = jin + (str[i]-'0');
if(cur == 0){
jin = 0;
ans++;
}else if(cur == 1){
jin = 1;
ans+=2;
}else{
jin = 1;
ans++;
}
}
if(jin)ans++;
cout<<ans<<endl;
return 0;
}
// 超时代码
#include <bits/stdc++.h>
using namespace std;
// 判断是否
bool isOne(string s){
for(int i = s.size() - 1; i >= 0; i--){
if(i == s.size() - 1 && s[i] == '0')
return false;
else if(i == s.size() - 1 && s[i] == '1' )
continue;
if(s[i] == '1')
return false;
}
return true;
}
int main() {
string str;
cin >> str;
int cnt = 0;
while(1) {
// 判断是否剩1
if(isOne(str))
break;
// 判断奇偶 如果为奇数最低位 + 1
if(str[str.size() - 1] == '1') {
// 直到遇到 0 停止
int i;
for(i = str.size() - 1; i >= 0; i--){
// 遇到 0 则停止
if(str[i] == '0'){
str[i] = '1';
break;
}
else
str[i] = '0';
}
// 全部元素都遍历一遍说明需要进位
if(-1 == i)
str.insert(0, 1, '1');
}
// 偶数右移
else{
for(int i = str.size() - 1; i > 0; i--)
str[i] = str[i - 1];
// 删去最高位元素
str.erase(0, 1);
}
// 循环次数++
cnt++;
}
cout << cnt;
}