题解:洛谷 B4063 奇数和偶数
【题目来源】
洛谷:B4063 [GESP202412 一级] 奇数和偶数 - 洛谷(luogu.com.cn)
【题目描述】
小杨有 \(n\) 个正整数,他想知道其中的奇数有多少个,偶数有多少个。
【输入】
第一行包含一个正整数 \(n\),代表正整数个数。
之后 \(n\) 行,每行包含一个正整数。
【输出】
输出两个正整数(英文空格间隔),代表奇数的个数和偶数的个数。如奇数或偶数的个数为 \(0\),则对应输出 \(0\)。
【输入样例】
5
1
2
3
4
5
【输出样例】
3 2
【核心思想】
-
问题分析:给定 \(n\) 个正整数,统计其中奇数和偶数的个数。这是一个奇偶性判定问题,核心在于利用取模运算判断整数的奇偶性。
-
算法选择:
- 取模判定:\(x \bmod 2 = 1\) 为奇数,\(x \bmod 2 = 0\) 为偶数
- 计数器累加:分别维护奇数计数器 \(odd\) 和偶数计数器 \(even\)
-
关键步骤:
- 读入数据:读取 \(n\)
- 逐数判定(\(i\) 从 \(1\) 到 \(n\)):
- 读入 \(x\)
- 若 \(x \bmod 2 = 1\):\(odd \leftarrow odd + 1\)
- 否则:\(even \leftarrow even + 1\)
- 输出结果:\(odd\) 和 \(even\)
-
时间/空间复杂度:
- 时间复杂度:\(O(n)\),每个数一次取模判断
- 空间复杂度:\(O(1)\),仅使用两个计数器
-
奇偶性判定的核心思想:
- 位运算等价性:\(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
浙公网安备 33010602011771号