写一段代码完成下面题目题目描述 小明不喜欢二进制下的5,即101。小明可以将一个数二进制里的1改成0,对于一个64位无符号整数,他至少变换多少个1,才能使得其二进制中不出现101这个子串? 比如整数21,其二进制为10101,小明只要把中间的那个1改成0,就不会出现101这个子串了。 输入 第一行是一个整数T(1≤T≤10000),表示样例的个数。 以后每行一个64位无符号整数。 输出 每行输出一个样例的结果。
时间: 2023-05-18 21:05:39 浏览: 225
#include <iostream>
#include <bitset>
using namespace std;
int main() {
int T;
cin >> T;
while (T--) {
unsigned long long n;
cin >> n;
bitset<64> b(n); // 将整数转换为二进制表示
int cnt = 0;
for (int i = 0; i < 62; i++) { // 从第0位到第62位遍历
if (b[i] && b[i+1] && !b[i+2]) { // 如果出现101子串
b[i+1] = 0; // 将中间的1改为0
cnt++; // 计数器加1
}
}
cout << cnt << endl;
}
return 0;
}
相关问题
用C语言完成下面题目:题目描述 小明不喜欢二进制下的5,即101。小明可以将一个数二进制里的1改成0,对于一个64位无符号整数,他至少变换多少个1,才能使得其二进制中不出现101这个子串? 比如整数21,其二进制为10101,小明只要把中间的那个1改成0,就不会出现101这个子串了。 输入 第一行是一个整数T(1≤T≤10000),表示样例的个数。 以后每行一个64位无符号整数。 输出 每行输出一个样例的结果。
思路:
对于一个二进制数,我们可以从高位到低位遍历,如果当前位为1,我们可以将其变为0,但是这样可能会导致后面出现101的情况,因此我们需要考虑后面的情况。如果当前位为1,且下一位也为1,那么我们就需要将下一位变为0,这样才能避免出现101的情况。如果当前位为1,但下一位为0,那么我们就可以将当前位变为0,因为这样不会影响后面的情况。
代码实现:
我们可以定义一个函数,用来计算一个数中1的个数,然后在主函数中调用这个函数,求出最少需要变换的1的个数。
代码如下:
小明对二进制中的1情有独钟,请你帮小明计算一个10进制数的2进制下有多少个0。
好的,让我来解答你的问题。假设要计算的十进制数为n,可以将n转换为二进制数,然后统计其中0的个数即可。具体步骤为:
1. 将n除以2,得到商和余数,余数为n的二进制数的最低位(从右往左数)。
2. 将商作为新的n,重复步骤1,直到商为0。
3. 统计所有余数为0的次数,即为n的二进制数中0的个数。
以下是一个示例的Python代码实现:
```python
n = 42 # 要计算的十进制数
count = 0 # 记录0的个数
while n > 0:
if n % 2 == 0: # 判断余数是否为0
count += 1
n //= 2 # 整除2,更新商
print(count) # 输出结果
```
在这个示例中,要计算的十进制数为42,其二进制表示为101010,其中0的个数为3。
阅读全文