1 条题解
-
0
思路与算法
枚举1至1000。对当前数不断除2,根据余数是1还是0累加位数;1的数量严格大于0的数量则A计数增加,最后输出A及1000-A。
正确性说明
除2取余逐步给出完整二进制位,到商0停止,未添加前导0。比较条件与定义相同,等量情况归B。每个整数被枚举一次、唯一归类,故两数总和1000且分类正确。独立答案用Python二进制文本直接数1和0。
复杂度
推广上界B时O(B log B)时间、O(1)额外空间。固定B=1000,最多10次取位,实际常量开销;两个计数变量初始化O(1)。
易错点
不能把数字按固定32位补0,否则分类改变。1本身的二进制为1,归A。相等时归B,不是A。只输出两个总数而不是逐个列举。
参考代码(C++11)
#include <bits/stdc++.h> using namespace std; int main() { int a = 0; for (int n = 1; n <= 1000; ++n) { int ones = 0, zeros = 0; for (int x = n; x; x /= 2) if (x % 2) ++ones; else ++zeros; a += ones > zeros; } cout << a << ' ' << 1000 - a << '\n'; }
- 1