NOIP 普及组初赛 · NOIP 2010 普及组初赛试题 第 25 题

阅读程序 · 答案 120 112 · 考点:ASCII编码、循环结构、运算符与表达式、模拟

← 整套速查表 NOIP 普及组初赛 全部真题

题目

阅读程序写结果:

#include <iostream>
#include <string>
using namespace std;

int main()
{
    string s;
    char m1, m2;
    int i;
    
    getline(cin, s);
    m1 = ' ';
    m2 = ' ';
    for (i = 0; i < s.length(); i++)
        if (s[i] > m1) {
            m2 = m1;
            m1 = s[i];
        }
        else if (s[i] > m2)
            m2 = s[i];
    cout<<int(m1)<<' '<<int(m2)<<endl;
    return 0;
} 

输入:Expo 2010 Shanghai China 输出:_________

提示:

字符空格'0''A''a'
ASCII码32486597
答案:120 112

考点

ASCII编码循环结构运算符与表达式模拟 讲解 →模拟 真题汇总 →

解题思维

这题就是考ASCII码大小关系和循环找最大、次大值的逻辑。拿到输入先别急着跑代码,心里过一遍:空格最小,数字其次,大写字母再其次,小写字母最大。字符串里只要出现小写字母,最大值肯定在小写字母里找。

常见错误

很多初学者会忽略大小写对ASCII的影响,以为字母顺序就是大小顺序,或者把空格当成0处理,导致找错最大值。还有人在找次大值时,没考虑到当最大值更新时,原来的最大值要自动降级为次大值,而不是只保留原来的次大值。比如遇到'x'时,'p'还没被识别为次大,这时候要先把'p'赋值给m2,再把'x'给m1,否则结果会错。

详细解析(节选)

考点与命题视角

这道题考查的是ASCII编码的大小关系、字符与整数的转换(int(char))、以及循环中同时维护最大值和次大值的逻辑。命题人喜欢在这种“找最大/次大”的题目里挖坑:

1. 大小写陷阱:大写字母(65-90)比小写字母(97-122)小,但字母表顺序里大写在前。如果学生按字母表顺序想,就会误判。 2. 空格与数字:空格(32)是最小的,数字(48-57)次之,容易被忽略。 3. 次大值更新逻辑:当发现一个比当前最大值还大的字符时,原来的最大值必须“降级”为次大值,否则结果错误。

人话讲清楚概念

同考点真题

在 OI伴学 里做这道题
登录后可计时作答、查看完整六段式解析,并按你的错题自动生成同类练习。
去刷题先做一次 AI 学情诊断