阅读程序 · 答案 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
这题本质就是模拟:先跑冒泡排序把三个数排好,再按嵌套 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 在排序后可能已经变了。