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

阅读程序 · 答案 2 20 77 91 · 考点:顺序结构、分支结构、运算符与表达式、基础算法

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

题目

阅读程序写结果:

#include <iostream>
using namespace std;

void swap(int & a, int & b)
{
    int t;
    t = a;
    a = b;
    b = t;
}

int main()
{
    int a1, a2, a3, x;
        
    cin>>a1>>a2>>a3;
    if (a1 > a2)
        swap(a1, a2);
    if (a2 > a3)
        swap(a2, a3);
    if (a1 > a2)
        swap(a1, a2);
    
    cin>>x;
    if (x < a2)
        if (x < a1)
            cout<<x<<' '<<a1<<' '<<a2<<' '<<a3<<endl;
        else
            cout<<a1<<' '<<x<<' '<<a2<<' '<<a3<<endl;
    else
        if (x < a3)
            cout<<a1<<' '<<a2<<' '<<x<<' '<<a3<<endl;
        else
            cout<<a1<<' '<<a2<<' '<<a3<<' '<<x<<endl;    
    return 0;
}

输入: 91 2 20 77

答案:2 20 77 91

考点

顺序结构分支结构运算符与表达式基础算法

解题思维

这题本质就是模拟:先跑冒泡排序把三个数排好,再按嵌套 if 把新数插进去。拿到代码别急着看答案,一步步手推变量变化,特别是 swap 传参和 if 的嵌套层级,就能稳稳拿到分。

常见错误

很多学生会把排序后的 a2 当成 91,从而误判 x 和 a2 的大小关系,导致输出顺序错乱;还有人会忽略 swap 是引用传参,以为 a1,a2,a3 没变,直接按原输入 91,2,20 去套后面的 if,结果整个逻辑全崩;另外对嵌套 if 的缩进不敏感,容易把 x<a2 为真时的分支和 x<a3 的分支搞混,以为只要 x 比某个数小就无条件插前面,而题目里 x 比 a2 大但比 a3 小时,必须插到 a2 和 a3 之间。

详细解析(节选)

考点与命题视角

这道题考查的是冒泡排序的思想(用三次比较交换保证升序)和分支结构嵌套(根据 x 与已排好序的三个数的大小关系决定插入位置)。命题人喜欢在排序后立刻插入一个新数,考察学生是否真的理解了排序后的状态,而不是死记硬背输入输出顺序;同时,嵌套 if 的层级和条件顺序是经典的“挖坑点”,很多学生只看表面条件,忽略了 a2 在排序后可能已经变了。

概念人话版

同考点真题

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