题解
2026-02-26 13:14:30
发布于:浙江
4阅读
0回复
0点赞
题目解析
- 输入输出:第一行输入整数 表示数据量,第二行输入 个非负整数。输出两个整数:所有数字二进制表示中 的总个数,以及校验码( 的个数为奇数输出 ,否则输出 )。
- 数据范围:,(即每个数可用 位二进制表示)。
- 复杂度要求:由于每个数最多 位二进制,时间复杂度 ,即 级别;空间复杂度 。
- 算法知识点:
二进制位运算、奇偶校验、逐位统计
思路解析
- 统计所有数字的1的个数:遍历每个输入数字,对每个数字通过不断除以 (右移)的方式,逐位检查其二进制表示中 的个数。
- 逐位检查原理:对于任意整数 , 的结果即为 二进制表示的最低位( 或 )。若为 则计数器加一,随后将 除以 (整数除法等价于右移一位),继续检查下一位,直到 变为 。
- 计算校验码:累计得到所有数字中 的总数 后,校验码即为 (奇数为 ,偶数为 )。
- 输出结果:按格式要求依次输出 的总数和校验码。
完整代码
#include <bits/stdc++.h>
using namespace std;
int main() {
int n;
cin >> n;
int one_cnt = 0; // 统计所有数字二进制中1的总数
while (n--) {
int x;
cin >> x;
// 逐位提取二进制表示,统计1的个数
while (x != 0) {
if (x % 2 == 1) { // 关键:检查最低位是否为1(等价于 x & 1)
one_cnt++;
}
x /= 2; // 关键:右移一位(等价于 x >>= 1),处理下一位
}
}
// 输出1的总数,以及奇偶校验码(奇数为1,偶数为0)
cout << one_cnt << " " << one_cnt % 2 << endl;
return 0;
}
这里空空如也

有帮助,赞一个