题解:洛谷 B4063 奇数和偶数

【题目来源】

洛谷:B4063 [GESP202412 一级] 奇数和偶数 - 洛谷(luogu.com.cn)

【题目描述】

小杨有 \(n\) 个正整数,他想知道其中的奇数有多少个,偶数有多少个。

【输入】

第一行包含一个正整数 \(n\),代表正整数个数。

之后 \(n\) 行,每行包含一个正整数。

【输出】

输出两个正整数(英文空格间隔),代表奇数的个数和偶数的个数。如奇数或偶数的个数为 \(0\),则对应输出 \(0\)

【输入样例】

5
1
2
3
4
5

【输出样例】

3 2

【核心思想】

  1. 问题分析:给定 \(n\) 个正整数,统计其中奇数和偶数的个数。这是一个奇偶性判定问题,核心在于利用取模运算判断整数的奇偶性。

  2. 算法选择

    • 取模判定\(x \bmod 2 = 1\) 为奇数,\(x \bmod 2 = 0\) 为偶数
    • 计数器累加:分别维护奇数计数器 \(odd\) 和偶数计数器 \(even\)
  3. 关键步骤

    • 读入数据:读取 \(n\)
    • 逐数判定\(i\)\(1\)\(n\)):
      • 读入 \(x\)
      • \(x \bmod 2 = 1\)\(odd \leftarrow odd + 1\)
      • 否则:\(even \leftarrow even + 1\)
    • 输出结果\(odd\)\(even\)
  4. 时间/空间复杂度

    • 时间复杂度:\(O(n)\),每个数一次取模判断
    • 空间复杂度:\(O(1)\),仅使用两个计数器
  5. 奇偶性判定的核心思想

    • 位运算等价性\(x \bmod 2\) 等价于 \(x \& 1\)(按位与),在二进制表示中最低位为 \(1\) 则为奇数,为 \(0\) 则为偶数
    • 在线统计:读入一个数立即判定并更新计数器,无需存储所有数,空间最优
    • 零值处理:题目允许输出 \(0\),计数器初始化为 \(0\) 自然满足要求
    • 适用于基础分类统计、奇偶筛选类入门问题

【算法标签】

入门 #数学

【代码详解】

#include <bits/stdc++.h>
using namespace std;

const int N = 1e5 + 10;  // 定义常量N,表示数组的最大大小
int n;                   // n: 输入的整数个数
int odd, even;           // odd: 奇数个数,even: 偶数个数

int main() {
    cin >> n;  // 输入整数个数n

    // 遍历输入的n个整数
    for (int i = 1; i <= n; i++) {
        int x;
        cin >> x;  // 输入当前整数x

        if (x % 2) odd++;  // 如果x是奇数,odd加1
        else even++;       // 如果x是偶数,even加1
    }

    // 输出奇数个数和偶数个数
    cout << odd << " " << even << endl;

    return 0;
}

【运行结果】

5
1
2
3
4
5
3 2
posted @ 2026-07-16 16:22  团爸讲算法  阅读(85)  评论(0)    收藏  举报