1. 平衡数问题解析
今天我们来探讨一个有趣的算法问题——平衡数统计。这个问题看似简单,但涉及到位运算、二进制表示等计算机科学基础知识,非常适合用来检验编程基本功。
1.1 问题定义
平衡数的定义非常直观:对于一个正整数,如果其二进制表示中1和0的个数相等,就称它为平衡数。这里需要注意几个关键点:
- 二进制表示不考虑前导零。比如数字12的二进制是"1100",而不是"00001100"。
- 只统计有效位中的0和1数量。
- 数字必须是正整数(0不被考虑)。
1.2 输入输出要求
输入格式:
- 第一行:正整数n,表示数字个数(1 ≤ n ≤ 100)
- 第二行:n个正整数,以空格分隔(每个数 ≤ 10^9)
输出格式:
- 一个整数,表示平衡数的个数
需要模型API调用? 免费领10W Token,多模型网关一键接入 Claude、DeepSeek 等主流模型。
2. 解题思路分析
2.1 核心算法
解决这个问题的核心在于:
- 将每个数字转换为二进制表示(不考虑前导零)
- 统计二进制表示中1和0的数量
- 比较两者数量是否相等
2.2 关键步骤实现
2.2.1 二进制转换与统计
最直接的方法是使用除2取余法,同时统计0和1的数量:
cpp复制int count = 0;
while(num > 0) {
int remainder = num % 2;
if(remainder == 0) zeroCount++;
else oneCount++;
num /= 2;
}
2.2.2 边界条件处理
需要注意几个特殊情况:
- 数字1的二进制是"1",0的数量为0,不平衡
- 数字2的二进制是"10",是平衡数
- 数字0不被考虑(题目已保证输入为正整数)
2.3 算法优化
虽然题目数据规模不大(n≤100),但我们可以考虑一些优化:
- 使用位运算代替除法运算:
cpp复制while(num > 0) {
if(num & 1) oneCount++;
else zeroCount++;
num >>= 1;
}
- 提前终止:如果发现某种数字的数量已经超过二进制位数的一半,可以提前结束统计
3. 完整代码实现
下面是C++的完整实现,包含了输入处
