AC题解
2026-05-01 14:32:35
发布于:重庆
0阅读
0回复
0点赞
对每个数,计算其二进制中 1 的个数和 0 的个数。
1 的个数:可直接用内置函数 __builtin_popcount,或循环统计。
0 的个数:总位数减去 1 的个数。总位数即最高位的位置,可用 31 - __builtin_clz(x) 求得(x>0)。
比较:若 1的个数 > 0的个数,则为 A 类;否则(≤)为 B 类。
因为 n≤10000,即使对每个数逐位统计也完全可行。
最终输出 A 类总数和 B 类总数。
#include <iostream>
using namespace std;
int main() {
int n;
cin >> n;
int cntA = 0, cntB = 0;
for (int i = 1; i <= n; ++i) {
int ones = __builtin_popcount(i); // 1 的个数
int total_bits = 32 - __builtin_clz(i); // 二进制总位数(i>0)
int zeros = total_bits - ones; // 0 的个数
if (ones > zeros) cntA++;
else cntB++;
}
cout << cntA << " " << cntB << endl;
return 0;
}
这里空空如也







有帮助,赞一个