题目描述
小明不喜欢二进制下的5,即101。小明可以将一个数二进制里的1改成0,对于一个64位无符号整数,他至少变换多少个1,才能使得其二进制中不出现101这个子串?
比如整数21,其二进制为10101,小明只要把中间的那个1改成0,就不会出现101这个子串了。
输入
第一行是一个整数T(1≤T≤10000),表示样例的个数。 以后每行一个64位无符号整数。
输出
每行输出一个样例的结果。
样例输入
3 21 45 1
样例输出
1 2 0
样例解释
45的二进制为101101,可以变第2个和最后1个1为0。
#include <iostream>
#include <vector>
using namespace std;
int minimumChanges(unsigned long long n) {
int changes = 0;
vector<int> bits;
while (n > 0) {
bits.push_back(n % 2);
n /= 2;
}
int len = bits.size();
for (int i = 2; i < len; i++) {
if (bits[i] == 1 && bits[i - 1] == 0 && bits[i - 2] == 1) {
bits[i] = 0;
changes++; // Increment changes when modified
}
}
return changes;
}
int main() {
int T;
cin >> T;
while (T--) {
unsigned long long n;
cin >> n;
cout << minimumChanges(n) << endl;
}
return 0;
}
人工智能写的