熟悉bitset
链接:https://ac.nowcoder.com/acm/contest/11217/A
来源:牛客网
dd在玩数字游戏,首先他拿到一个xxx
当xxx不为零时进行如下操作
如果二进制xxx中有奇数个111,则xxx二进制形式下最低位取反(即000变成111,111变成000)
如果二进制xxx中有偶数个111,则xxx二进制形式下非前导零最高位取反
询问对于一个xxx,操作几次后变为零
函数
std::bitset<8> bits1; // 默认初始化:00000000 std::bitset<8> bits2(42); // 从整数初始化:00101010 std::bitset<8> bits3("10101010"); // 从字符串初始化:10101010

#include <bits/stdc++.h> using namespace std; int flipOperations(int x, int bitLength = 32) { bitset<32> bits(x); // 最多支持 32 位整数 int steps = 0; while (bits.count() > 0) { int ones = bits.count(); if (ones % 2 == 1) { // 奇数个 1 → 翻转最低位 bits.flip(0); // 翻转最低位(不管原来是 0 还是 1) } else { // 偶数个 1 → 翻转最左边的 1 for (int i = bitLength - 1; i >= 0; --i) { if (bits.test(i)) { bits.reset(i); break; } } } steps++; } return steps; } int main() { int T; cin >> T; while (T--) { int x; cin >> x; cout << flipOperations(x) << endl; } return 0; }
浙公网安备 33010602011771号