题解:洛谷 P2955 Even Odd
【题目来源】
洛谷:P2955 [USACO09OCT] Even? Odd? G - 洛谷
【题目描述】
Bessie那惨无人道的二年级老师搞了一个有 \(N\) 个正整数 \(I\) 的表叫Bessie去判断“奇偶性”(这个词语意思向二年级的学生解释,就是“这个数是单数,还是双数啊?”)。Bessie被那个表的长度深深地震惊到了,竟然跟栋栋的泛做表格一样多道题!!!毕竟她才刚刚学会数数啊。
写一个程序读入 \(N\) 个整数,如果是双数,那么在单立的一行内输出 even,如果是单数则类似地输出 odd。
【输入】
第一行:一个整数 \(N\)
接下来 \(N\) 行:第 \(j\) 行一个整数 \(l_j\),表示用于确定奇数或偶数的第 \(j\) 个整数
【输出】
一共 \(N\) 行:第 \(j\) 行包含单词 even 或 odd ,具体取决于 \(l_j\) 的奇偶性
【输入样例】
2
1024
5931
【输出样例】
even
odd
【核心思想】
-
问题分析:给定 \(N\) 个正整数,判断每个数是奇数还是偶数。这是一个直接判断/字符串技巧问题,关键在于利用"一个数的奇偶性只由其最后一位数字决定"的性质,通过字符串读取并判断末位字符的奇偶性。
-
算法选择:
- 字符串末位判断:将数字作为字符串读入,判断最后一个字符的奇偶性,避免大数整型溢出问题
-
关键步骤:
- 读取输入:\(N\) 和 \(N\) 个数字字符串
- 逐个判断:
- 取字符串最后一个字符
s[s.length()-1] - 若该字符对应的数字为偶数(
%2 == 0):输出even - 否则:输出
odd
- 取字符串最后一个字符
-
时间/空间复杂度:
- 时间复杂度:\(O(N \cdot L)\),\(L\) 为数字字符串平均长度
- 空间复杂度:\(O(L)\),仅需存储一个数字字符串
-
字符串末位判断的核心思想:
- 奇偶性的位判定:一个整数的奇偶性仅取决于其十进制表示的最后一位,与前面的位数无关
- 大数友好:用字符串处理可避免 \(10^{18}\) 以上大数的整型溢出问题,虽然本题数据范围不大,但方法具有通用性
- 常数时间判断:只需访问字符串最后一个字符,\(O(1)\) 完成奇偶判定
- 适用于"数字奇偶性判断"类基础问题,核心是利用末位性质简化计算
【解题思路】

【算法标签】
入门 #字符串入门
【代码详解】
#include <bits/stdc++.h>
using namespace std;
int n;
string s;
int main()
{
cin >> n; // 输入n
for (int i=1; i<=n; i++) { // 遍历n个数
cin >> s; // 使用字符串形式读入s
if (s[s.length()-1]%2==0) { // 判断s的最后一位是奇数还是偶数
cout << "even" << endl;
} else {
cout << "odd" << endl;
}
}
return 0;
}
【运行结果】
2
1024
even
5931
odd
浙公网安备 33010602011771号