

第 1 题 2026年春节联欢晚会上一个武术表演节目《武 BOT》。节目中多个人形机器人会表演空翻,它们落地可能会有微微踉跄,但都会迅速调整姿态站稳,并适当移动来和前后左右的其他机器人保持原来队列。如果将机器人视作一个计算机系统,那么在该计算机系统中下面哪一项不能作为输入设备( )。
A. 检测重心的重力传感器
B. 预装的AI算法程序
C. 接收动作指令的遥控器
D. 拍摄其他机器人的摄像头
【答案】B
【考纲知识点】
输入设备:是向计算机输入数据和信息的设备,作用是将外部信息(物理信号、指令、图像等)转换为计算机能处理的电信号 / 数字信号,是用户与计算机系统交互的重要工具。
常见输入设备:传感器、遥控器、摄像头、键盘、鼠标等;程序 / 软件属于存储在计算机中的指令集合,不属于硬件输入设备。
【解析】
A 选项:重力传感器可以检测机器人的重心状态,将物理姿态信息输入给计算机系统,属于输入设备。
B 选项:预装的 AI 算法程序是存储在计算机中的软件指令,用于处理输入的数据、控制机器人动作,不是输入设备,符合题意。
C 选项:遥控器可以向机器人发送动作指令,将指令输入给系统,属于输入设备。
D 选项:摄像头可以拍摄其他机器人的位置,将图像信息输入给系统,用于队列调整,属于输入设备。
第 2 题 小明学习编程有一段时间了,他想在图形环境下把当前目录(或文件夹)下的文本文件 20260314.txt 的名字改一下。他用鼠标左键点击选中该文件后,立即完成下面哪个操作后将处于输入新文件名的状态( ):
A. 单击右键并选择弹出菜单中的“重命名”
B. 双击左键
C. 按功能键 F1
D. 按回车键
【答案】A
【考纲知识点】
Windows 系统文件重命名的常用操作:
选中文件后,右键选择「重命名」 选中文件后,按 F2 功能键 选中文件后,再次单击文件名(非图标) 部分系统中,选中文件后按回车键也可触发重命名(不同系统 / 设置略有差异)
双击左键:默认是打开文件 / 文件夹 F1:默认是打开帮助文档
【解析】
A 选项:选中文件后,右键选择「重命名」,会直接进入文件名编辑状态,符合要求。
B 选项:双击左键会直接打开该 txt 文件,不会进入重命名状态,错误。
C 选项:F1 是打开系统帮助,和重命名无关,错误。
D 选项:在 Windows 系统中,选中文件后按回车键默认是打开文件,而非重命名(仅部分特殊设置 / 系统支持,不是标准操作),错误。
第 3 题 下面C++代码可以执行,有关说法正确的是( )。

A. 为了方便初学者, cout << (PI) 和 cout << (pi) 效果相同,即变量的大小写不敏感
B. cout << (PI) 修改为 cout << (Pi) 能正常执行
C. 不能用 PI 做变量名,因为要保存圆周率这个常量
D. 将程序中全部 PI 都改写为 Pai ,将能正常执行,不会报错
【答案】D
【考纲知识点】
C++ 变量命名规则:
C++ 是大小写敏感的语言, PI、Pi、pi是三个完全不同的变量名。变量名可以自定义,只要符合命名规则(字母、数字、下划线,不能以数字开头,不能是关键字), PI可以作为变量名(C++ 标准中没有内置PI关键字,M_PI是<cmath>中的宏定义,不是关键字)。变量必须先定义、后使用,未定义的变量会编译报错
【解析】
A 选项:C++ 严格区分大小写,PI和pi是不同变量,pi未定义会报错,错误。
B 选项:Pi和定义的PI是不同变量,Pi未定义,修改后会编译报错,错误。
C 选项:PI不是 C++ 关键字,完全可以作为变量名,错误。
D 选项:将所有PI改为Pai,变量定义和使用一致,符合语法,能正常执行,正确。
第 4 题 C++表达式 3 * 3 % 2 的值为( )。
A. 81
B. 27
C. 4
D. 1
【答案】D
【考纲知识点】
C++ 运算符优先级与结合性:
乘法 *和取模%属于同一优先级,运算顺序为从左到右(左结合)。取模运算 %:计算两个整数相除的余数,要求操作数均为整数。
【解析】
按照从左到右的顺序计算:
先算 3 * 3 = 9再算 9 % 2:9 除以 2 商 4 余 1,结果为 1
第 5 题 整型变量 a 、 b 的初值都是 4,则下面的C++代码执行后的输出是( )。


【答案】A
【考纲知识点】
1、逗号运算符的优先级:逗号运算符 , 是 C++ 中优先级最低的运算符,运算顺序为从左到右,整个逗号表达式的值为最后一个表达式的值。
语句 a, b = 3, 4; 等价于 (a), (b = 3), (4);:仅执行了 b = 3 的赋值,a 保持初始值 4 不变。
2、cout 连续输出规则:cout 会按顺序拼接输出多个表达式的结果,不会自动添加空格或换行,endl 用于换行。
【解析】
1、初始状态:a = 4,b = 4
2、执行 a, b = 3, 4;:
逗号表达式从左到右执行,仅 b = 3 生效,a 仍为 4,b 变为 3
3、执行第一行 cout << (a + 2) << (b - 2) << endl;:
a + 2 = 4 + 2 = 6
b - 2 = 3 - 2 = 1
连续输出为 61,然后换行
4、执行第二行 cout << a << b << endl;:
a = 4,b = 3
连续输出为 43,然后换行
第 6 题 下面C++代码的相关说法,正确的是( )。

A. 执行时如输入 10 ,则将输出 10
B. 执行时如输入 3.14 ,将报错
C. 执行时如输入 ABC ,将报错
D. 执行时如输入 -10 ,将报错
【答案】A
【考纲知识点】
1、cin 输入机制:cin 用于向变量读取数据,若变量类型为int,则仅接收整数(含正负整数),输入非整数时会触发输入流错误,变量值保持不变(或 0),且后续cin操作会失效。
2、数据类型匹配:int 是整型,仅存储整数,无法直接存储小数 / 字符串。
【解析】
A 选项:输入10是合法整数,N被赋值为 10,输出10,正确。
B 选项:输入3.14是小数,cin读取整数时会截断(仅读取3),不会直接报错(变量N变为 3),错误。
C 选项:输入ABC是字符串,会触发输入流错误,cin状态置为失败,此时输出N的值为 0,而非直接报错,错误。
D 选项:输入-10是合法负整数,N被赋值为 - 10,输出-10,不会报错,错误。
第 7 题 下面C++代码执行时,其说法正确的是( )。

A. 如果输入一个正数和一个负数,其输出结果肯定是大于0
B. 不管是负整数、正整数亦或0,其结果肯定是大于等于0
C. 如果 N 和 M 是相等的整数,将不会有输出
D. 如果 N 和 M 输入带有小数点的数,将按整数部分计算
【答案】B
【考纲知识点】
1、绝对值计算:代码逻辑为 N > M 时输出 N-M,否则输出 M-N,本质是计算 M 和 N 的差值的绝对值。
2、整数运算:输入为整数,运算结果也为整数,非负。
【解析】
A 选项:若输入1和-2,N-M = -2-1 = -3,输出3(大于 0);但逻辑是 “差值的绝对值”,并非 “肯定大于 0”(输入相等时输出 0),错误。
B 选项:差值的绝对值结果一定≥0,正确。
C 选项:N 和 M 相等时,输出0(M-N=0),并非无输出,错误。
D 选项:输入带小数点的数(如3.14),cin读取int类型时会截断小数部分,但会触发输入警告,且不是 “按整数部分计算” 的标准合法行为,错误。
(cin 读取 int,遇到小数点会停止,输入 “3.5” 会读入整数部分 3,剩余部分留在输入流中,后面 cin >> N 会尝试读取,可能导致错误行为(比如读取 0 或失败)。这句话说“按整数部分计算”是误解,实际上输入 “3.5 2.3” 会导致 M=3,然后 cin >> N 时读入 “.5” 会失败(因为类型不匹配),N 会保持 0 或之前的值(未定义)。)
第 8 题 下面C++代码执行后的输出是( )。


【答案】D
【考纲知识点】
1、for 循环执行流程:初始化i=0 → 条件i<5成立 → 执行循环体 → i++ → 重复判断。
2、乘法运算:tnt *= i 等价于 tnt = tnt * i。
3、printf 格式化输出:%2d 表示按2 位宽度输出整数,不足则补空格。
【解析】
初始:tnt = 1
第 1 次循环(i=0):tnt = 1 * 0 = 0 → 输出 0 0(%2d 显示 0 为 0)
第 2 次循环(i=1):tnt = 0 * 1 = 0 → 输出 0 1
第 3 次循环(i=2):tnt = 0 * 2 = 0 → 输出 0 2
第 4 次循环(i=3):tnt = 0 * 3 = 0 → 输出 0 3
第 5 次循环(i=4):tnt = 0 * 4 = 0 → 输出 0 4
printf在循环外部,循环结束后i=5,所以输出0 5
第 9 题 执行下面C++代码段求序列 -1+2+3-4+5+6-7+8+9-10+11+12...... 之值。例如输入 4 ,则计算序列前4项的值,规律如序列所示,输出为 0 。下面说法中正确的是( )。

A. L1行中 i < N + 1 应该修为 i < N 才会符合预期
B. L2行中 i % 3 == 1 应修改为 i % 3 == 0 才会符合预期
C. L2行中 i % 3 == 1 修改为 i % 3 与当前程序效果相同
D. 当前代码能实现题目所描述计算目标
【答案】D
【考纲知识点】
1、循环条件:i < N+1 等价于 i ≤ N,与题目要求 “计算前 N 项” 一致。
2、取模运算:i%3==1 表示 i 除以 3 余 1;若改为i%3==0则表示整除。
3、题目逻辑:序列 -1+2-3+4+5-6+7+8-9+... 规律为每 3 个数为一组,第 1 个数为负,后 2 个数为正(即i=1,4,7,10...为负,其余为正)。
【解析】
A.❌ 错误。若改成 i < N,则最后一项 i = N 不执行,结果就错了。比如 N=4 只算 i=1..3 → 结果是 4,不是 0,不符合。
B.❌ 错误。这样 i=3 时也变成负号,规律不对(本应正号)。
C.❌ 错误。i%3 可以等于 0、1、2,作为 if 条件时,当 i%3 != 0 都会判断为真,而 i%3==0 时会进入 else,明显与原来不同,除非特殊说明 0 或 1,但 C++ 里 if(i%3) 等价于 if(i%3 != 0),与 i%3==1 不一样,所以效果不同。
D. 当前代码能实现题目所描述计算目标 → ✅ 正确。
第 10 题 下面C++代码的相关说法,正确的是( )。

A. 上述代码执行后,其输出是 1#3#5#7#9#9END
B. 删除 else 后的执行效果与当前代码相同
C. 删除 else 且将 cout << i << "#" 移入L1行下面,则执行效果与当前代码相同
D. 在 cout << i << "END" 前增加判断 if(i > 10) ,其执行效果与当前代码相同
【答案】B
【考纲知识点】
1、for循环执行逻辑:初始化i=1 → 判断i<10 → 执行循环体 → i++ → 重复判断,直到条件不成立。
2、continue语句:跳过本次循环剩余代码,直接进入下一次循环(执行i++,再判断条件)。
3、if-else分支逻辑:if条件成立时执行if块,否则执行else块;删除else后,无论if是否成立,后续代码都会执行(除非被continue跳过)。
4、循环结束后变量值:循环终止时,i的值为最后一次使条件不成立的值(本题中i<10,循环结束时i=10)。
【解析】
A. ❌ 错误。循环结束时i=10,不是 9,因此最后输出10END,而非9END。
B ✅ 正确。偶数i执行continue,跳过输出;奇数i不执行continue,执行cout,输出i#。

C. ❌ 错误。continue会直接跳过该cout,因此cout永远不会执行,输出为空,和原代码完全不同
D. ❌ 错误。循环结束时i=10,if(i>10)条件不成立,因此cout << i << "END"不会执行,最终输出仅为1#3#5#7#9#,和原代码的1#3#5#7#9#10END完全不同。
第 11 题 一个正整数的每位都是个位数,称为数位,最高位非0。下面的C++代码用于求正整数的所有数位之和,简称数位和。如 123 的各数位分别是1、2、3,则其数位和为 1+2+3 ,结果为6。为实现该目标,横线处应该填写的代码是( )。


【答案】B
【考纲知识点】
1、取个位:N % 10 取余运算,获取最后一位数字。
2、去个位:N /= 10 整除运算,去掉最后一位数字。
3、累加:tnt += N % 10 将个位数字累加到结果中。
【解析】
题目代码逻辑
功能:求正整数 N 的所有数位之和。核心步骤:循环取出 N 的个位累加,然后 N 除以 10 去掉个位,直到 N 变为 0。
初始tnt = 0。
循环体中:先取个位 tnt += N % 10,再去个位 N /= 10。
选项分析:
A:tnt += N / 10 取的是十位,错误。
B:tnt += N % 10 取个位,N /= 10 去个位,正确。
C:N %= 10 保留个位,循环卡死,错误。
D:N %= 10 保留个位,循环卡死,错误。
第 12 题 小明想要快速知道任给一个正整数中有多少个奇数位(数位值是奇数),下面的C++代码是其实现,横线处应该填入的代码是( )。

A. N % 10 % 2 == 0
B. N % 10 % 2 == 1
C. N / 10 / 2 == 1
D. N / 2 / 10 == 0
【答案】B
【考纲知识点】
1、奇数判断:数字对 2 取余结果为 1。
2、取个位:N % 10 获取最后一位。
【解析】
题目代码逻辑
功能:统计正整数 N 中数位为奇数的个数。
核心步骤:循环取个位,判断是否为奇数,若是则计数 + 1,N 去个位。
循环体中if语句需判断当前个位是否为奇数。
选项分析:
A:N % 10 % 2 == 0 判断偶数,错误。
B:N % 10 % 2 == 1 判断个位为奇数,正确。
C:N / 10 / 2 == 1 逻辑错误,错误。
D:N / 2 / 10 == 0 逻辑错误,错误。
第 13 题 小明和弟弟在玩一个拼数字游戏,游戏规则是:二人各写一个两位正整数 M 和 N ;然后将较大的数字放在较小的前面,拼成一个4位数;将这个4位数除以3的余数添加到4位数的后面,得到一个5位数;最后判断这个5位数能否被14整除。下面的C++代码用于判断 M 和 N 是否符合全部要求,如果符合则输出 Y 否则输出 N 。例如输入 85 和 79 ,可以拼出 85792 ,恰好是14的倍数,则输出 Y 。关于下面代码描述正确的是( )。

A. 代码段不能完成正确判断
B. L1行代码中条件应该改为 M <= N
C. L2行代码应该改为 if ((Q*10+Q/3) % 14 == 0)
D. 代码段可以不使用变量 Q ,而是在区分 M 和 N 大小后分别直接用它们来判断
【答案】D
【考纲知识点】
1、拼接运算:M*1000+N 表示将 M 作为千位,N 作为后两位拼接。
2、余数生成:Q*10 + Q%14 表示将余数添加到末尾。
3、取模运算:% 14 判断是否整除。
【解析】
题目代码逻辑
拼接规则:大数放前,小数放后组成 4 位数 Q。 生成规则:将 Q 除以 14 的余数添加到 Q 后,组成 5 位数。 判断:判断 5 位数是否为 14 的倍数。
A:代码能正确判断,故错误。
B:若将条件改为 M≤N,则当 M>N 时会错误地将小数放前面,故错误。
C:应使用余数 Q%3 而不是整除 Q/3,故错误。
D:确实可以不用变量 Q,直接在分支中计算表达式,例如:

第 14 题 执行下面C++代码可以判断一个6位正整数 N 的高3位和低3位的差是否是314的倍数。例如 628314 就符合要求。横线处应该填入( )。

A. ((N % 1000) - (N / 1000)) / 314 == 0
B. ((N / 1000) - (N % 1000)) % 314 == 0
C. ((N % 1000) - (N / 1000)) / 314
D. ((N / 1000) - (N % 1000)) % 314
【答案】B
【考纲知识点】
1、取低位 3 位:N % 1000。
2、取高位 3 位:N / 1000。
3、倍数判断:两数之差对 314 取余结果为 0。
【解析】
表达式为(高位3位 - 低位3位) % 314 == 0。
代入:((N / 1000) - (N % 1000)) % 314 == 0。
选项分析:
A:高低位顺序反了,错误。
B:表达式正确,正确。
C:不是取模判断,错误。
D:顺序和取模都错,错误。
第 15 题 N 是一个正整数。如果 N 的所有奇数位的数位和等于所有偶数位的数位和,则称它是一个“双螺旋数”。例如 12375 的所有奇数位的数位和是9,同时它的所有偶数位的数位和也是9,则 12375 就是一个双螺旋数。下面的C++代码用于判断输入的 N 是否为双螺旋数。空白处应该填入的代码是( )。



【答案】A
【考纲知识点】
1、交替取位:循环取个位,交替累加到N1(奇位)和N2(偶位)。
2、取个位:N % 10。
3、去个位:N /= 10。
【解析】
题目代码逻辑
功能:统计正整数 N 的奇数位数字之和与偶数位数字之和,判断是否相等。
需先取个位累加到N1,再去个位,取下一位累加到N2,重复此过程。
选项分析:
A:N1 += N%10 取个位加 N1,N /= 10 去个位;N2 += N%10 取下一位加 N2,N /= 10 去个位。正确。
B:N/10 取的是十位,错误。
C:N%=10 保留个位,循环卡死,错误。
D:混合错误,错误。
二、判断题(每题2分,共20分)

第 1 题 小明的妈妈最近刚刚给他买了一块电话手表,除了可以看时间,小明也可以用它和妈妈打电话、收发信息,那么可以推测这块手表中装有一款特定操作系统。
【答案】√
【考纲知识点】智能穿戴设备(电话手表)属于嵌入式智能设备,需要操作系统来管理硬件、运行应用、实现通信等功能。
【解析】电话手表需要实现通话、信息、计时、定位等功能,这些都依赖嵌入式操作系统(如常见的 Wear OS、Android Wear、厂商自研的 RTOS 等)来调度硬件资源、运行程序,因此必然搭载特定操作系统。
第 2 题 C++表达式 4 % 2 和 2 * 2 % 2 的结果相同。
【答案】√
【考纲知识点】C++ 取模运算符%的运算规则、运算符优先级
【解析】
%是取模(求余)运算符,要求操作数为整数,结果是两数相除的余数。
运算符优先级:* 高于 %,因此2 * 2 % 2先算乘法:4 % 2。
两个表达式最终都是4 % 2,结果均为0,因此结果相同。
第 3 题 下面C++代码段成功执行后将输出 0 。

【答案】×
【考纲知识点】for 循环执行流程、break 语句的作用
【解析】
for 循环从i=1开始执行:
i=1:1%3≠0,不执行 break,i++变为 2
i=2:2%3≠0,不执行 break,i++变为 3
i=3:3%3==0,执行break,跳出循环
循环结束时i=3,因此cout << i输出3,不是 0。
第 4 题 下面能够正常执行的C++代码段用于求1到N之和,N为正整数。因为 i < N + 1 ,所以是1到N且包含N之和。

【答案】×
【考纲知识点】for 循环的语法、分号;的作用、变量作用域
【解析】代码存在 2 个致命问题:
1、for 循环后多了分号;:分号代表空语句,for 循环仅执行空语句,循环结束后i的值为N+1,total += i只执行 1 次,最终total = N+1,不是 1 到 N 的和。
2、变量tnt未使用,total、i、N未声明(题目假设正常执行,仅逻辑错误)。
即使去掉分号,i < N+1等价于i <= N,逻辑正确,但分号导致循环失效,因此题目描述错误。
第 5 题 执行下面的C++代码段,其语句 cout << (N) 将被执行0次或无数次(即死循环)。

【答案】√
【考纲知识点】while 循环的条件判断、死循环的成因
【解析】
while 循环的条件while(N)等价于while(N != 0):
若输入N=0:条件为假,循环体cout << N执行 0 次。
若输入N≠0:条件永远为真(循环体中未修改N的值),循环会无限执行,cout << N无数次执行(死循环)。
因此语句只会执行 0 次或无数次,描述正确。
第 6 题 下面的C++代码段的变量都是整型,它能用于判断输入的正整数是否为对称数。所谓对称数是指从左到右和从右到左读该数,其值相同。例如, 121 和 414 都是对称数,而 123 不是对称数。( )

【答案】√
【考纲知识点】数字反转算法、对称数(回文数)判断
【解析】
代码逻辑:
1、保存原数old_number = n,初始化反转数new_number=0。
2、while(n != 0)循环:每次取n的最后一位(n%10),拼接到new_number末尾(new_number*10 + 余数),然后n去掉最后一位(n /=10),最终new_number是原数的反转。
3、比较原数和反转数,相等则为对称数,否则不是。
该算法是判断回文数的经典方法,对正整数完全有效,因此描述正确。
第 7 题 执行下面的C++代码段,如果变量都为整型变量,输入为大于0的整数,则输出数值一定为 -N 的值。

【答案】√
【考纲知识点】for 循环的步长、等差数列求和
【解析】等差数列求和:首项a1 = -N,末项an = N-2(因为i < N,最大的i是N-1中步长 2 的数,即N-2当N为偶数,N-1当N为奇数)
项数n = N
和S = n*(a1+an)/2 = N*(-N + (N-2))/2 = N*(-2)/2 = -N,因此结果恒为-N,题目描述正确。
第 8 题 执行C++语句 printf("%d\n", 3.14) 将报错。
【答案】×
【考纲知识点】C 语言printf的格式匹配规则、类型隐式转换
【解析】printf是 C 标准库函数,不会进行编译期类型检查,因此语句不会编译报错(语法合法)。
运行时:%d要求对应参数为int类型,而3.14是double类型,会导致未定义行为(输出乱码、崩溃等),但不会 “报错”(编译通过、运行无报错提示)。
因此题目描述 “将报错” 错误
第 9 题 执行下面的C++代码后将输出 2500 。

【答案】√
【考纲知识点】自增运算符++的优先级、for 循环的执行流程
【解析】i的取值是1,3,5,...,99,共 50 项,和为(1+99)*50/2 = 2500,因此输出 2500,题目描述正确。
第 10 题 小明在测试C++的 printf 的功能时执行了 printf("%-5d\n", 314) ,则代码输出的结果是 -5314 。
【答案】×
【考纲知识点】printf格式化输出、%d的左对齐格式
【解析】
1、%-5d的格式说明:
(1)%d:输出十进制整数。
(2)-:左对齐(默认右对齐)。
(3)5:输出宽度为 5,不足 5 位用空格填充。
2、执行printf("%-5d", 314):
数字314占 3 位,左对齐,右侧补 2 个空格,输出为"314 "(314 后加 2 个空格),总长度 5。
3、题目描述输出-5314完全错误,-是左对齐标志,不是输出负号,5是宽度,不是数字。
3.1 编程题 1
试题名称:交朋友
时间限制:1.0 s
内存限制:512.0 MB
3.1.1
题目描述


【考纲知识点】
1. 基础语法与输入输出
- (1)变量定义与赋值:
用独立变量存储输入数据,替代数组,适合固定数量(本题 4 个)的输入场景。 (2)cin输入规则:cin会自动跳过换行、空格等空白符,因此即使输入分 4 行,cin >> h1 >> h2 >> h3 >> h4也能正确读取。(3)cout输出:直接输出最终筛选结果,完成题目要求。
2. 数学工具:绝对值计算
(1)abs()函数:来自 <cmath>头文件,用于计算两个整数差值的绝对值,用来衡量身高的「接近程度」(差值越小,身高越接近)。(2)原理: |a - b|可以统一表示两个数的距离,避免正负号干扰比较。
3. 多条件优先级筛选(核心逻辑)
题目要求两个优先级,必须严格遵守:
- (1)第一优先级:
与 Alice 身高的绝对差值最小(最接近) - (2)第二优先级:
若差值相同,选择身高更矮的那个
(3)本质是「多关键字排序」的简化版:先按「差值」升序,再按「身高」升序,取第一个元素。
4. 迭代更新最优解思想
(1)从初始候选解出发,逐个遍历剩余候选,不断用「更优解」替换当前最优,最终得到全局最优解。 (2)这是遍历类问题的通用思路,无需数组、排序,仅用变量就能完成。
【解题思路】(纯变量版)
步骤 1:明确输入与角色
(1)输入共 4 个整数,第 1 个是 Alice 的身高,后 3 个是其他小朋友的身高。 (2)用 4 个独立变量存储: h1(Alice)、h2、h3、h4(其他 3 人)。
步骤 2:初始化最优解
(1)以第 2 个小朋友( h2)为初始最优:best_h:记录当前最优身高,初始值 = h2
best_diff:记录当前最优的绝对差值,初始值 = abs(h2 - h1)
步骤 3:逐个比较、更新最优解
依次用剩余小朋友(h3、h4)和当前最优解比较,按规则更新:
(1)计算当前小朋友与 Alice 的差值: diff = abs(当前身高 - h1)- (2)比较规则:
(2.1)若 diff < best_diff:当前小朋友更接近 → 直接更新best_h和best_diff(2.2)若 diff == best_diff:差值相同 → 比较身高,若当前身高更矮 → 更新best_h(2.3)若 diff > best_diff:不更新,保持当前最优
步骤 4:输出最终结果
遍历完所有小朋友后,best_h 就是 Alice 要找的朋友的身高,直接输出即可。
【参考程序】
#include<iostream>#include<cmath>// 用于abs()计算绝对值using namespace std;intmain(){// 1. 用4个独立变量读取输入,h1是Alice的身高int h1, h2, h3, h4;cin >> h1 >> h2 >> h3 >> h4;// 2. 初始化最优解:以h2为初始最优int best_h = h2;int best_diff = abs(h2 - h1);// 3. 用h3和当前最优比较,更新int diff3 = abs(h3 - h1);if (diff3 < best_diff) {best_diff = diff3;best_h = h3;} else if (diff3 == best_diff && h3 < best_h) {best_h = h3;}// 4. 用h4和当前最优比较,更新int diff4 = abs(h4 - h1);if (diff4 < best_diff) {best_diff = diff4;best_h = h4;} else if (diff4 == best_diff && h4 < best_h) {best_h = h4;}// 5. 输出最终结果cout << best_h << endl;return 0;}
【思路延伸(通用化)】
如果题目改为「n 个小朋友」,纯变量写法就不再适用,需要用数组 + 循环的通用方案,但核心的「迭代更新最优解」思想完全不变:
1、初始化最优解为第 2 个元素 2、循环遍历剩余元素,按相同规则更新 3、最终输出最优解
数组存储、循环遍历、迭代更新最优解、多条件比较、绝对值计算。
【解题思路】
2、把第二个小朋友设为初始最优。 3、循环遍历后面所有小朋友,按 “差值最小、相同则更矮” 更新最优。 4、输出最终最优身高。
#include<iostream>#include<cmath>using namespace std;intmain(){int n;cin >> n; // 输入人数int h[105]; // 数组存身高for (int i = 0; i < n; i++) {cin >> h[i];}int alice = h[0]; // Alice 身高int best = h[1]; // 初始最优:第2个小朋友int bestDiff = abs(h[1] - alice);// 遍历剩下所有人(从第3个开始)for (int i = 2; i < n; i++) {int now = h[i];int diff = abs(now - alice);if (diff < bestDiff) {bestDiff = diff;best = now;} else if (diff == bestDiff && now < best) {best = now;}}cout << best << endl;return 0;}3.2 编程题 2
试题名称:数字替换
时间限制:1.0 s
内存限制:512.0 MB
3.2.1 题目描述
Alice 不喜欢数字 4,但觉得数字 8 寓意好,她想把数中的 4 全都替换成 8,若数中不含 4 则无需修改,你能帮帮她吗?
3.2.2 输入格式
输入一行,包含一个整数 A,表示替换前的数。
3.2.3 输出格式
输出一行,包含一个整数B ,表示替换后的数。

【考纲知识点】
1、字符 / 字符串处理:将数字按字符逐位处理,是替换数字中特定字符的最直观、最不易出错的方法。
2、遍历与条件替换:遍历字符串的每一位字符,遇到'4'就替换为'8',其他字符保持不变。
3、输入输出处理:直接以字符串形式读取输入,避免整数运算的复杂处理(如取模、反转)。
4、边界情况处理:处理输入为0、无4的数字等特殊场景。
【解题思路】
方法一:字符串法(简单直观)
这是最适合本题的解法,逻辑清晰、代码简洁,完全规避整数运算的复杂度。
- 1、以字符串形式读取输入:
直接把输入的数字当成字符串处理,无需转换为整数。 - 2、逐字符遍历替换:
(1)遍历字符串的每一个字符: (2)如果字符是 '4',就替换为'8'(3)其他字符保持原样 - 3、直接输出替换后的字符串:
替换完成后直接输出,无需再转换回整数。
方法二:整数运算法(传统数学方法)
适合需要用纯整数运算的场景,通过取模逐位处理数字。
- 1、初始化结果变量:
res = 0,pow = 1(用于还原位数) - 2、逐位取模处理:
循环对原数 A取模10,得到最后一位数字: (1)如果该位是 4,替换为8(2)将处理后的数字乘以 pow,加到结果res中(3)pow *= 10,A /= 10,处理下一位- 3、输出最终结果:
循环结束后, res就是替换后的数字。
【参考程序1】(字符串法)
#include<iostream>#include<string>using namespace std;intmain(){string s;cin >> s; // 直接以字符串形式读取输入// 遍历每一位字符,替换4为8for (char &c : s) { // 引用传参,直接修改原字符if (c == '4') {c = '8';}}cout << s << endl; // 直接输出替换后的字符串return 0;}
【参考程序2】(整数运算法)
#include<iostream>using namespace std;intmain(){int A;cin >> A;long long res = 0; // 用long long防止溢出long long pow = 1;// 处理0的特殊情况if (A == 0) {cout << 0 << endl;return 0;}while (A > 0) {int digit = A % 10; // 取最后一位if (digit == 4) {digit = 8;}res += digit * pow; // 还原位数pow *= 10;A /= 10; // 去掉最后一位}cout << res << endl;return 0;}
【易错点避坑】
1、字符串法的引用传参:for (char &c : s) 必须用引用,否则修改的是副本,原字符串不会改变。
2、整数法的溢出问题:输入最大为10^8,替换后最大为888888888,必须用long long存储结果,避免int溢出。
3、0 的特殊处理:整数法中A=0时,循环不会执行,必须单独处理输出0。
4、字符与数字的区别:字符串中是字符'4',不是整数4,不能用digit == 4判断,否则逻辑错误。
1、字符串法是处理「数字逐位修改」类问题的通用最优解,比如:数字反转、删除特定数字、替换特定数字等,都可以用这种方法快速解决。 2、整数运算法适合理解数字的位运算逻辑,在嵌入式、底层开发等场景更常用。

