进阶 · 数组
奇偶统计
读 N 个数,报告偶数和奇数各几个。两个计数器走一个循环 — 加上一个判题很乐意考的负数细节。
一句话答案用两个计数器分别统计偶数和奇数,按 "even: E" 和 "odd: O" 两行输出;负奇数的 n % 2 是 −1,所以要和 0 比较而不是和 1 比较。
题目
输入: 第一行 N(1 ≤ N ≤ 1000);第二行 N 个整数(可为负或零)。
输出: 两行:even: E 和 odd: O。
样例:
输入: 输出:
5 even: 2
1 2 3 4 5 odd: 3
你的解答
「运行我的输入」用的自定义输入
判题在浏览器本地运行。死循环会在 3 秒后被自动中断 —— 但还是确保每个循环都有出口。代码随打随存。
卡住了?提示
提示 1 — 并行计数器
都从 0 开始,循环里:if (a % 2 == 0) even++; else odd++;。不需要数组 — 和数组最大值一样,可以随到随处理。
提示 2 — −3 是奇数吗?0 呢?
-3 % 2 等于 -1(余号随被除数 — 见整数除法),所以判断要写 == 0,永远别写 == 1:-3 % 2 == 1 是假的,负数会被分错类。而 0 是偶数 — 0 % 2 == 0 成立。
题解(先自己试试!)
#include <iostream>
using namespace std;
int main() {
int n;
cin >> n;
int even = 0, odd = 0;
for (int i = 0; i < n; i++) {
int a;
cin >> a;
if (a % 2 == 0) even++;
else odd++;
}
cout << "even: " << even << endl;
cout << "odd: " << odd << endl;
return 0;
}
"循环里放计数器"是所有分类题的通式:数正数、数 80 分以上、按长度数单词。好的变体:统计末位数字 0–9 各出现几次(十个计数器 — 或十个计数器的数组,那是通往更大想法的门)。
深度解析
为什么这样做对
两个独立计数器在同一趟里跑,说明「多个统计、一次遍历」是常态。同一批数据很少需要跑两遍。
代价
O(n) 时间、O(1) 空间,一趟填满两个计数器。
常见错法
n % 2 == 1对负奇数判不出来:-3 % 2 是 -1。要写成n % 2 != 0。- 在循环里重置计数器,等于把最后一次之前的结果全丢了。
下一步
把两个计数器扩成一组桶:数字出现次数。
记住这两句
- C++ 里 -3 % 2 == -1,要判 != 0 而不是 == 1。
- 一趟遍历可以同时填多个计数器。
🐞 这段是错的 —— 点开,亲手让它挂一次
n % 2 == 1 判不出负奇数
#include <iostream>
using namespace std;
int main() {
int n;
cin >> n;
int even = 0, odd = 0;
for (int i = 0; i < n; i++) {
int v;
cin >> v;
if (v % 2 == 0) even++;
else if (v % 2 == 1) odd++;
}
cout << "even: " << even << endl;
cout << "odd: " << odd << endl;
return 0;
}