进阶 · 数组

奇偶统计

读 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

你的解答

main.cpp — 你的解答
「运行我的输入」用的自定义输入

判题在浏览器本地运行。死循环会在 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;
}