c语言 tyy 上课时发现,无论什么二进制对它进行如下操作,都可以变为 1: 如果该二进制数为奇数,则将该数加 1。 如果该二进制数为偶数,则将该数除以 2。 给你一个二进制数 x,需要你把它变为 1 ,问多少次操作后,x 会变为 1。 输入格式 输入一行一个字符串,表示二进制数 x(都由0和1构成)。 所有测试点满足,x 的首位不为 0,且位数不超过 106。 输出格式 输出一个整数,表示操作次数
时间: 2024-02-06 18:12:59 浏览: 127
tyy-server:TypeScript GraphQL服务器样板
好的,我可以解答你的问题。这是一个经典的问题,可以用位运算来解决。具体的做法是,从右往左扫描二进制数 x,每次判断最右边的一位是 0 还是 1,如果是 0,将 x 除以 2,否则将 x 加 1,然后继续判断下一位。直到 x 变成 1 为止,这样的操作次数就是我们要求的答案。下面是 C++ 代码实现:
```c++
#include <iostream>
#include <string>
using namespace std;
int main() {
string s;
cin >> s;
int cnt = 0;
for (int i = s.size() - 1; i >= 0; i--) {
if (s[i] == '0') {
s = s.substr(0, i);
} else {
cnt++;
if (i == 0) {
break;
}
int j = i - 1;
while (j >= 0 && s[j] == '1') {
j--;
}
if (j >= 0) {
s[j] = '1';
for (int k = j + 1; k < i; k++) {
s[k] = '0';
}
} else {
s = '1' + s;
for (int k = 0; k < i; k++) {
s[k + 1] = '0';
}
}
}
}
cout << cnt << endl;
return 0;
}
```
这个算法的时间复杂度是 O(n),其中 n 是二进制数 x 的位数。
阅读全文