题解:洛谷 P2955 Even Odd

【题目来源】

洛谷:P2955 [USACO09OCT] Even? Odd? G - 洛谷

【题目描述】

Bessie那惨无人道的二年级老师搞了一个有 \(N\) 个正整数 \(I\) 的表叫Bessie去判断“奇偶性”(这个词语意思向二年级的学生解释,就是“这个数是单数,还是双数啊?”)。Bessie被那个表的长度深深地震惊到了,竟然跟栋栋的泛做表格一样多道题!!!毕竟她才刚刚学会数数啊。

写一个程序读入 \(N\) 个整数,如果是双数,那么在单立的一行内输出 even,如果是单数则类似地输出 odd

【输入】

第一行:一个整数 \(N\)

接下来 \(N\) 行:第 \(j\) 行一个整数 \(l_j\),表示用于确定奇数或偶数的第 \(j\) 个整数

【输出】

一共 \(N\) 行:第 \(j\) 行包含单词 evenodd ,具体取决于 \(l_j\) 的奇偶性

【输入样例】

2
1024
5931

【输出样例】

even
odd

【核心思想】

  1. 问题分析:给定 \(N\) 个正整数,判断每个数是奇数还是偶数。这是一个直接判断/字符串技巧问题,关键在于利用"一个数的奇偶性只由其最后一位数字决定"的性质,通过字符串读取并判断末位字符的奇偶性。

  2. 算法选择

    • 字符串末位判断:将数字作为字符串读入,判断最后一个字符的奇偶性,避免大数整型溢出问题
  3. 关键步骤

    • 读取输入\(N\)\(N\) 个数字字符串
    • 逐个判断
      • 取字符串最后一个字符 s[s.length()-1]
      • 若该字符对应的数字为偶数(%2 == 0):输出 even
      • 否则:输出 odd
  4. 时间/空间复杂度

    • 时间复杂度:\(O(N \cdot L)\)\(L\) 为数字字符串平均长度
    • 空间复杂度:\(O(L)\),仅需存储一个数字字符串
  5. 字符串末位判断的核心思想

    • 奇偶性的位判定:一个整数的奇偶性仅取决于其十进制表示的最后一位,与前面的位数无关
    • 大数友好:用字符串处理可避免 \(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
posted @ 2026-08-28 15:56  团爸讲算法  阅读(5)  评论(0)    收藏  举报