
「GESP练题小程序艾墨舟编程小先锋」专为GESP考生打造的免费题库。涵盖图形化/Python/C++全真题,支持真题模考、考前预测、错题整理与学习统计,一站式攻克客观题。
本次GESP Python一级考试包含15道单选题(每题2分)、10道判断题(每题2分)和2道编程题(每题25分),考试时长为120分钟。试题内容严格遵循Python一级考纲,重点考察计算机基础知识、Python基础语法、顺序/分支/循环结构、基本数据类型、运算符、输入输出以及turtle绘图模块的使用。
以下将对每道题目进行详细解析,帮助考生理解考点、掌握解题思路。
───── ✨ 第1题 ✨ ─────
题目:2026年春节联欢晚会上的武术表演节目《武BOT》。节目中多个人形机器人会表演空翻,它们落地可能会有微微踉跄,但都会迅速调整姿态站稳,并适当移动来和前后左右的其他机器人保持原来队列。如果将机器人视作一个计算机系统,那么在该计算机系统中下面哪一项不能作为输入设备 ( ) 。
A. 用于检测重心的重力传感器
B. 预装的AI算法程序
C. 接收动作指令的遥控器
D. 拍摄其他机器人的摄像头
考查知识点:计算机基础知识(输入设备概念)。
详细解析:
输入设备是向计算机系统输入数据和信息的设备,用于将外部信息转换为计算机可以处理的信号。输出设备则是将计算机处理后的结果呈现给用户的设备。程序(软件)本身是处理逻辑的集合,不属于硬件输入/输出设备范畴。
| 程序(软件)是计算机执行的指令集合,它本身不是输入设备 | ||
答案:B
───── ✨ 第2题 ✨ ─────
题目:小明学习编程有一段时间了,他想在图形环境下把当前目录(或文件夹)下的文本文件20260314.txt的名字改一下。他用鼠标左键点击选中该文件后,立即完成下面哪个操作后将处于输入新文件名的状态 ( ) 。
A. 单击右键并选择弹出菜单中的 “重命名”
B. 双击左键
C. 按功能键 F1
D. 按回车键
考查知识点:计算机基础知识(文件操作)。
详细解析:
在图形化操作系统中,重命名文件的常用方法是先选中文件,然后通过右键菜单选择“重命名”选项,之后文件名会变为可编辑状态。
答案:A
───── ✨ 第3题 ✨ ─────
题目:有关下面Python代码的说法,正确的是 ( ) 。
PI = 3.1415926
print(PI)
A. 为了方便初学者,print(PI)和print(pi)效果相同,即变量的大小写不敏感
B. print(PI)修改为print(Pi)能正常执行
C. 不能用 PI 做变量名,因为要保存圆周率这个常量
D. 将程序中 PI 全部改写为 Pai,将能正常执行,不会报错
考查知识点:Python基础语法(变量命名、大小写敏感)。
详细解析:
Python是大小写敏感的语言,这意味着PI、Pi、pi是三个不同的变量名。代码中定义了变量PI,打印PI是合法的。如果将PI全部改为Pai,只要保持一致性,代码逻辑不变,依然可以正常执行。
Python是大小写敏感的语言PI和pi是不同的,如果未定义pi,打印pi会导致NameError。 | ||
Pi未被定义,执行print(Pi)会引发NameError。 | ||
PI作为变量名。 | ||
PI统一修改为Pai,即Pai = 3.1415926; print(Pai),逻辑完全正确,可以正常执行。 |
答案:D
───── ✨ 第4题 ✨ ─────
题目:Python表达式3 * 3 ** 2的值为 ( ) 。
A. 81
B. 27
C. 24
D. 18
考查知识点:Python基本运算(运算符优先级)。
详细解析:
Python中运算符的优先级是:*(指数运算)高于 (乘法)。因此,表达式 3 * 3 ** 2 的计算顺序是:先计算 3 ** 2 得到 9,再计算 3 * 9 得到 27。
答案:B
───── ✨ 第5题 ✨ ─────
题目:下面的Python代码执行后,其输出是 ( ) 。
a, b = 3, 4
print(a + 2, b - 2)
print(a, b)
A.
5 2
3 4
B.
5 2
5 2
C.
52
34
D.
52
52
考查知识点:Python基本语句(赋值、打印、默认分隔符)。
详细解析:a, b = 3, 4 是Python的多元赋值,将3赋值给a,4赋值给b。print(a + 2, b - 2) 会计算 a+2 为5,b-2 为2,然后打印这两个值。默认情况下,print函数用空格分隔多个参数,所以输出是 5 2。
第二行 print(a, b) 打印变量a和b的原始值,即 3 4。
因此,输出结果为两行:5 2 和 3 4。
答案:A
───── ✨ 第6题 ✨ ─────
题目:下面Python代码的相关说法,正确的是 ( ) 。
N = int(input())
print(N)
A. 执行时如输入10,则将输出10
B. 执行时如输入3.14,则将输出3.14
C. 执行时如输入ABC,则将输出0
D. 执行时如输入-10,则将输出10
考查知识点:Python输入输出、数据类型转换。
详细解析:int(input()) 会先读取用户的输入(字符串),然后尝试将其转换为整数(int)。转换成功则打印该整数,转换失败(如输入非数字字符)则会抛出ValueError异常。
"10"可以被int()成功转换为整数10,然后打印。 | ||
"3.14",int()函数无法转换带小数点的字符串,会引发ValueError。 | ||
"ABC",int()无法转换,会引发ValueError,程序异常终止,不会输出0。 | ||
"-10",int()会成功转换为整数-10,然后打印-10,而不是10。 |
答案:A
───── ✨ 第7题 ✨ ─────
题目:下面Python代码执行时,其说法正确的是( )。
N = int(input())
M = int(input())
if N > M:
print(N - M)
else:
print(M - N)
A. 不管输入是正数负数还是0,其输出结果肯定是大于等于0
B. 不管是负整数、正整数亦或0,其结果肯定是大于等于0
C. 如果N和M是相等的整数,将不会有输出
D. 如果N和M输入带有小数点的数,将按整数部分计算
考查知识点:Python分支结构、绝对值逻辑。
详细解析:
代码逻辑是:如果N大于M,输出N-M;否则输出M-N。这实际上计算了|N - M|(N和M之差的绝对值),因此结果总是非负的。
代码逻辑实现了两数之差的绝对值N-M或M-N的结果都非负。例如:N=5, M=-3,N>M成立,输出5-(-3)=8;N=-5, M=3,N>M不成立,输出3-(-5)=8。 | ||
N > M为假,执行else分支,输出M - N,即0。 | ||
int(input())"3.14"),转换会失败,引发ValueError,程序不会继续执行到计算部分。 |
答案:A 和 B 都正确,但根据单选题规则,通常选最全面或最先出现的。原题答案为A。
───── ✨ 第8题 ✨ ─────
题目:下面Python代码执行后的输出是( )。
tnt = 1
for i in range(5):
tnt *= i
print(tnt, i)
A. 24 5
B. 10 5
C. 24 4
D. 0 4
考查知识点:Python循环结构(for循环、range函数)。
详细解析:range(5)生成序列[0, 1, 2, 3, 4]。循环变量i依次取这些值。
- 初始tnt=1。
-i=0:tnt *= 0=>tnt = 1 * 0 = 0
-i=1:tnt *= 1=>tnt = 0 * 1 = 0
-i=2:tnt *= 2=>tnt = 0 * 2 = 0
-i=3:tnt *= 3=>tnt = 0 * 3 = 0
-i=4:tnt *= 4=>tnt = 0 * 4 = 0
循环结束后,tnt的值为0,i的值为循环最后取的值,即4。因此输出为0 4。
答案:D
───── ✨ 第9题 ✨ ─────
题目:Python编程求数列-1+2+3-4+5+6-7+8+9-10+11+12-13+......之值。如输入4,则计算1到4包含1和4之间的值,规律如数列所示。下面说法,正确的是( )。
N = int(input("请输入正整数: "))
tnt = 0
for i in range(1, N + 1):
if i % 3 == 1:
tnt += -i
else:
tnt += i
print(tnt)
A. range(1, N + 1)应该修为range(1, N)才会符合预期
B. i % 3 == 1应修改为i % 3 == 0才会符合预期
C. i % 3 == 1修改为i % 3与当前程序效果相同
D. 当前代码能达到题目所描述目标
考查知识点:Python循环、取模运算、数列规律。
详细解析:
观察数列规律:-1, +2, +3, -4, +5, +6, -7, +8, +9, -10, ...
可以发现,每3个数为一组,每组第一个数为负,后两个数为正。即位置为1, 4, 7, 10...(即除以3余1的数)是负号。
代码中if i % 3 == 1: 正好判断了除以3余1的数,将其取负加入总和,其余数直接加入总和。range(1, N+1)保证了计算从1到N(包含N)。因此代码逻辑正确。
range(1, N + 1)应该修为range(1, N)才会符合预期 | range(1, N+1)是正确的。 | |
i % 3 == 1应修改为i % 3 == 0才会符合预期 | i % 3 == 0 | |
i % 3 == 1修改为i % 3与当前程序效果相同 | i % 3if判断中视为True。因此当i%3为1或2时,条件为真,tnt += -i;为0时,条件为假,tnt += i。这与原逻辑(只有余1时取负)完全不同。 | |
答案:D
───── ✨ 第10题 ✨ ─────
题目:下面Python代码的相关说法,正确的是( )。
for i in range(1, 10):
if i % 2 == 0:
continue
else:
print(i, end = "#")
print(i,"END")
A. 上述代码执行后,其输出是1#3#5#7#9#9END
B. 删除else:后的执行效果与当前代码相同
C. 删除else:且print(i, end = "#")与 if 对齐,则执行效果与当前代码相同
D. 将print(i,"END")与 if 对齐,其执行效果与当前代码相同
考查知识点:Python循环、分支、continue语句、代码缩进。
详细解析:range(1,10)生成1到9。if i % 2 == 0:判断i是否为偶数,是则执行continue跳过本次循环剩余语句,直接进入下一次循环。因此,只有奇数(i%2!=0)才会执行else分支,打印i并以#结尾。循环结束后,执行最后的print(i, "END"),此时i的值为循环结束后的值,即9。所以输出为:1#3#5#7#9#9 END(注意print(i,"END")默认用空格分隔,所以是9 END)。
1#3#5#7#9#9END | 1#3#5#7#9#9 END,9和END之间有一个空格。选项描述少了空格。 | |
else:后的执行效果与当前代码相同 | elseprint语句。删除else:,并将print(i, end="#")与if对齐,逻辑变为:如果i是偶数,continue跳过;否则(奇数)执行打印。这与原代码逻辑完全一致。 | |
else:且print(i, end = "#")与 if 对齐,则执行效果与当前代码相同 | ||
print(i,"END")与 if 对齐,其执行效果与当前代码相同 | print(i, "END")成为else分支的一部分,只在i为奇数时执行。原代码中print(i, "END")在循环外,只执行一次。效果完全不同。 |
答案:B 和 C 都正确,但根据单选题规则,通常选最直接或最先出现的。原题答案为A?但A有误。根据解析,B和C正确。原题答案给的是A?我们核对原题答案列表,第10题答案是A?但解析显示A不准确。根据题目要求,我们按解析逻辑判断,B和C正确。但需遵循原答案?原答案列表第10题为A,但可能存在争议。我们以解析为准,认为B/C正确,但单选题只能选一个,通常选B。
───── ✨ 第11题 ✨ ─────
题目:下面的Python代码用于求正整数各位数之和(即数位和),约定高位不为0,如123则各位数之和为1+2+3结果为6。为实现该目标,横线处应该填写的代码是( )。
N = int(input())
tnt = 0
while N != 0:
____________
____________
print("各位数数之和为: ", tnt)
A.
tnt += N // 10
N //= 10
B.
tnt += N % 10
N //= 10
C.
tnt += N % 10
N /= 10
D.
tnt = tnt + N % 10
N /= 10
考查知识点:Python循环、整除与取模运算、数位分离算法。
详细解析:
求一个正整数N的各位数字之和的经典算法是:
1. 每次通过N % 10获取N的个位数字。
2. 将该数字累加到总和tnt中。
3. 通过N //= 10(整除10)去掉N的个位数字。
4. 重复直到N变为0。
关键点:必须使用整除//来去掉个位,如果使用浮点数除法/,N会变成浮点数,可能导致精度问题或循环无法终止。
tnt += N // 10; N //= 10 | N // 10tnt加的是12,而不是3。 | |
tnt += N % 10; N //= 10 | ||
tnt += N % 10; N /= 10 | N /= 10N % 10对浮点数取模可能产生意想不到的结果,且循环条件N != 0可能因浮点数精度问题无法终止。 | |
tnt = tnt + N % 10; N /= 10 | N /= 10导致N变为浮点数,算法错误。 |
答案:B
───── ✨ 第12题 ✨ ─────
题目:某个功能需要知道一个输入的正整数的各位数字中有多少个奇数,下面的Python代码是其实现,横线处应该填⼊的代码是( )。
N = int(input())
odd_count = 0 # 记录奇数的个数
old_number = N # 保存原数
while N != 0:
if _________________:
odd_count += 1
N = (N - N % 10) // 10
print(f"{old_number}中共有{odd_count}个奇数 ")
A. N % 10 % 2 == 0
B. N % 10 % 2 == 1
C. N // 10 // 2 == 1
D. N // 2 // 10 == 0
考查知识点:Python循环、取模运算、奇数判断。
详细解析:
代码通过N = (N - N % 10) // 10来去掉N的个位数字(等价于N //= 10)。在循环中,我们需要判断当前个位数字(即N % 10)是否为奇数。奇数的特征是除以2的余数为1。因此,判断条件应为(N % 10) % 2 == 1,可以简写为N % 10 % 2 == 1。
N // 10 | ||
答案:B
───── ✨ 第13题 ✨ ─────
题目:下面的Python执行后如果输入8,希望输出如下图形。相关说法,正确的是( )。
import turtle
N = int(input("请输入射线数量: "))
Angle = 360 / N # 计算出每条射线之间间隔的角度
for i in range(N):
turtle.right(Angle)
turtle.forward(100)
turtle.goto(0,0)
turtle.done()
A. Angle = 360 / N应该修为Angle = 360 // N才能实现输出效果
B. range(N)修改为range(1, N + 1)效果相同,都能实现输出效果
C. range(N)修改为range(1, N)效果相同,都能实现输出效果
D. turtle.right(Angle)应该修正为turtle.right(i * Angle)才能达到预期效果
考查知识点:Python turtle绘图、循环。
详细解析:
代码目标是绘制N条从原点出发的射线,均匀分布。每次循环:右转一个固定角度Angle,画一条长100的线,然后返回原点。Angle = 360 / N计算每条射线之间的角度差(可能是小数)。循环range(N)执行N次,绘制N条射线。
Angle = 360 / N应该修为Angle = 360 // N才能实现输出效果 | ///浮点数除法能保证角度精确。 | |
range(N)修改为range(1, N + 1)效果相同,都能实现输出效果 | range(N)range(1, N+1)生成1到N,也是循环N次。循环体内没有使用循环变量i,所以循环次数相同即可,效果相同。 | |
range(N)修改为range(1, N)效果相同,都能实现输出效果 | range(1, N) | |
turtle.right(i * Angle)应该修正为turtle.right(i * Angle)才能达到预期效果 | Angle,依次绘制射线。如果改为turtle.right(i * Angle),第一次转0度,第二次转Angle度,第三次转2*Angle度...,这会导致射线角度累加,画出的不是从原点出发的均匀射线,而是一条螺旋线。 |
答案:B
───── ✨ 第14题 ✨ ─────
题目:有关下面Python代码的说法,正确的是( )。
import turtle
turtle.forward(100)
turtle.left(90)
turtle.forward(100)
turtle.goto(0, 0)
turtle.done()
A. 代码执行后,将输出等腰直角三角形
B. 代码执行后,将输出等长的两条边,其夹角为90度,因为没有画出斜边,因此不是三角形
C. 代码执行后,90度夹角位于原点
D. 因为没有执行turtle.pendown(),所以不会画出图形
考查知识点:Python turtle绘图(默认画笔状态、goto函数)。
详细解析:
Turtle模块默认画笔是落下的(pendown状态)。代码先画一条水平向右100的线,然后左转90度,画一条垂直向上的100的线,此时形成了一个直角。最后turtle.goto(0,0)从当前位置画一条直线回到原点,从而画出了一个直角三角形。因为两条直角边相等(都是100),所以是等腰直角三角形。直角位于两条边的交点,即第一次forward的终点,第二次forward的起点。
turtle.goto(0,0) | ||
turtle.pendown(),所以不会画出图形 | penup()。 |
答案:A
───── ✨ 第15题 ✨ ─────
题目:在Python中,turtle.write()用于在当前坐标处输出文字。下面说法,错误的是( )。
import turtle
for i in range(1,10):
turtle.write(f"{i}+{i}={i*2}")
turtle.goto(i*40,0)
turtle.done()
A. 1+1=2输出在坐标原点,即(0,0)
B. 1+1=2的起点与2+2=4的起点间隔40个像素
C. 最后输出是10+10=20
D. 1+1=2等输出文字的下面将有一条直线
考查知识点:Python turtle绘图(write、goto)。
详细解析:range(1,10)生成1到9。循环中,先在当前位置用write输出文字,然后移动到新位置(i*40, 0)。
- i=1: 在原点(0,0)输出1+1=2,然后移动到(40,0)。
- i=2: 在(40,0)输出2+2=4,然后移动到(80,0)。
- ...
- i=9: 在(320,0)输出9+9=18,然后移动到(360,0)。循环结束。
注意:write函数输出文字时,默认不会移动画笔,所以文字下面不会有直线。
循环只到i=99+9=18,而不是10+10=20。因此这个说法错误。 | ||
turtle.write() |
题目要求找出错误的说法。C和D都是错误的。但单选题,通常选最明显错误的。原题答案给的是C。
答案:C
───── ✨ 第16题 ✨ ─────
题目:小明的妈妈最近刚刚给他买了一块电话手表,除了可以看时间,小明也可以用它和妈妈打电话、收发信息,那么可以推测这块手表中装有一款特定操作系统。( )
考查知识点:计算机基础知识(嵌入式系统、操作系统)。
详细解析:
现代智能设备(如电话手表、智能手机)通常都运行着特定的操作系统(如Android Wear、watchOS等),用于管理硬件资源、运行应用程序(如打电话、发信息)。因此这个推测是合理的。
答案:正确
───── ✨ 第17题 ✨ ─────
题目:Python表达式4 ** 2和2 * 2 ** 2的结果相同。 ( )
考查知识点:Python基本运算(指数运算、运算符优先级)。
详细解析:4 ** 2 计算4的2次方,结果为16。2 * 2 ** 2 中,**优先级高于*,所以先算2 ** 2得4,再算2 * 4得8。
16不等于8,所以结果不同。
4**2=162*2**2=2*4=8,两者结果不同。 |
答案:错误
───── ✨ 第18题 ✨ ─────
题目:下面Python代码执行后将输出0。 ( )
for i in range(1, 10):
if i % 3 == 0:
break
print(i)
考查知识点:Python循环、break语句。
详细解析:range(1,10)生成1到9。循环中,当i是3的倍数时,执行break跳出循环。第一次满足条件是i=3(3%3==0),此时break执行,循环立即终止。然后执行循环后的print(i),此时i的值就是3。所以输出是3,不是0。
答案:错误
───── ✨ 第19题 ✨ ─────
题目:下面Python代码用于求1到N之和,N为正整数。因为range(1, N + 1)中为N+1,因此是1到N且包含N之和。( )
N = int(input("请输入正整数: "))
total = 0
for i in range(1, N + 1):
total += i
print(total)
考查知识点:Python循环、range函数范围。
详细解析:range(start, stop)生成从start到stop-1的整数序列。因此range(1, N+1)生成1, 2, ..., N,包含了N。循环将这些数累加,确实是求1到N(包含N)的和。
range(1, N+1) | ||
答案:正确
───── ✨ 第20题 ✨ ─────
题目:执行下面的Python代码,其语句print(N)将被执行0次或无数次(即死循环)。( )
N = input()
while N:
print(N)
考查知识点:Python循环、输入、字符串的布尔值。
详细解析:N = input()读取用户输入,返回一个字符串。while N:判断字符串N的布尔值。在Python中,空字符串""的布尔值为False,非空字符串的布尔值为True。
- 如果用户直接按回车(输入空字符串),则N为"",while N为False,循环体一次都不执行,print(N)执行0次。
- 如果用户输入了任何非空内容(如一个数字、字母等),则N为非空字符串,while N为True,循环条件永远为真,且循环体内没有改变N的语句,因此会无限循环打印N的内容,即死循环。
所以,print(N)可能执行0次(输入为空),也可能执行无数次(输入非空)。
答案:正确
───── ✨ 第21题 ✨ ─────
题目:下面的Python代码能实现判断输入的正整数是否为对称数。所谓对称数是指从左到右和从右到左读该数,其值相同,如121或414等是对称数,而123不是对称数。( )
n = int(input("请输入正整数:"))
old_number = n
new_number = 0
while n != 0:
new_number = new_number * 10 + n % 10
n //= 10
if old_number == new_number:
print("对称数")
else:
print("非对称数")
考查知识点:Python循环、数位反转算法。
详细解析:
代码通过while循环,每次取出n的个位(n%10),并将其添加到new_number的末尾(通过new_number * 10 + n % 10实现),然后去掉n的个位(n //= 10)。循环结束后,new_number就是n反转后的数字。最后比较原数old_number和反转数new_number,如果相等,则是对称数(回文数)。该算法是判断回文数的标准算法之一,对于正整数是有效的。
答案:正确
───── ✨ 第22题 ✨ ─────
题目:执行下面的Python代码,如果输入为大于0的整数,则输出一定为0。( )
N = int(input())
total = 0
for i in range(-N, N, 2):
total += i
print(total)
考查知识点:Python循环、range函数(负步长?)、序列求和。
详细解析:range(-N, N, 2)生成一个从-N开始,到N-1结束(因为range不包含终点),步长为2的整数序列。
例如,输入N=5,序列为:-5, -3, -1, 1, 3。求和:(-5)+(-3)+(-1)+1+3 = -5。
输入N=4,序列为:-4, -2, 0, 2。求和:(-4)+(-2)+0+2 = -4。
序列总是对称的?让我们分析:序列是-N, -N+2, -N+4, ..., N-2(如果N为奇数,可能到N-1?)。这个序列关于0对称吗?不一定。例如N=5,序列有5个数(奇数个),中间项是-1,求和不为0。N=4,序列有4个数(偶数个),也不对称和为-4。
实际上,只有当N为奇数且序列恰好正负成对抵消时,和才为0。但这里序列是从-N开始,步长2,到N-1或N-2结束。计算通项:序列元素可以表示为-N + 2*k,k从0到(2N-1)//2。求和公式复杂,但显然不总是0。
所以“输出一定为0”是错误的。
答案:错误
───── ✨ 第23题 ✨ ─────
题目:执行Python语句print(int(3.14))将报错。( )
考查知识点:Python数据类型转换。
详细解析:int()函数可以将一个浮点数转换为整数,转换方式为截断小数部分(向零取整)。int(3.14)的结果是整数3。print(int(3.14))会打印3,不会报错。
int(3.14) |
答案:错误
───── ✨ 第24题 ✨ ─────
题目:下面的Python代码执行后,将输出等边三角形。( )
import turtle
turtle.circle(50, steps = 3)
turtle.done()
考查知识点:Python turtle绘图(circle函数的steps参数)。
详细解析:turtle.circle(radius, steps)函数:如果指定了steps参数,则画一个内切于圆的正多边形,边数为steps。circle(50, steps=3)就是画一个半径为50的圆的内接正三角形。因为正三角形的三条边相等,所以是等边三角形。
circle(50, steps=3) | ||
答案:正确
───── ✨ 第25题 ✨ ─────
题目:下面的Python代码执行后第一条直线与第二条直线相交于原点,两线之间的夹角为120度。( )
import turtle
turtle.forward(100)
turtle.right(60)
turtle.forward(100)
turtle.right(60)
turtle.forward(100)
turtle.done()
考查知识点:Python turtle绘图(角度、转向)。
详细解析:
代码绘制三条线段,每次画完一条线后右转60度。
1. 从原点出发,画第一条线(水平向右100)。
2. 右转60度,画第二条线(方向为-60度或300度)。
第一条线和第二条线的夹角:第一条线方向为0度,第二条线方向为-60度(或300度)。它们之间的夹角是60度(|0 - (-60)| = 60),而不是120度。这两条线相交于第一条线的终点,即点(100,0),而不是原点。
所以两个说法都错误。
答案:错误
───── ✨ 第26题 编程题1:交朋友 ✨ ─────
题目描述:Alice身高为H1,她班上有另外3个小朋友,身高分别为H2, H3, H4。Alice想和身高最接近她的人交朋友,如果有多个人的身高差相同(即同样接近),则Alice想和其中较矮的那一人做朋友。求这个朋友的身高。
解题思路:
1. 读入四个整数H1, H2, H3, H4。
2. 分别计算H2, H3, H4与H1的差的绝对值(身高差)。
3. 初始化“最佳朋友”为H2,其身高差为abs(H2-H1)。
4. 依次与H3和H4比较:
- 如果当前小朋友的身高差小于最佳朋友的身高差,则更新最佳朋友为当前小朋友。
- 如果身高差等于最佳朋友的身高差,且当前小朋友的身高小于最佳朋友的身高,则更新最佳朋友为当前小朋友(选择更矮的)。
5. 输出最佳朋友的身高。
参考代码实现:
# 读入4个小朋友的身高
H1 = int(input()) # Alice的身高
H2 = int(input())
H3 = int(input())
H4 = int(input())
# 计算与Alice的身高差(绝对值)
diff2 = abs(H2 - H1)
diff3 = abs(H3 - H1)
diff4 = abs(H4 - H1)
# 初始化最佳朋友为H2
best = H2
best_diff = diff2
# 比较H3
if diff3 < best_diff:
best = H3
best_diff = diff3
elif diff3 == best_diff and H3 < best:
best = H3
# 比较H4
if diff4 < best_diff:
best = H4
best_diff = diff4
elif diff4 == best_diff and H4 < best:
best = H4
print(best)
复杂度分析:
- 时间复杂度:O(1),只有固定次数的计算和比较。
- 空间复杂度:O(1),只使用了几个变量。
易错点提醒:
- 必须使用绝对值abs()来计算身高差,因为身高差是距离,不分正负。
- 在身高差相同时,要记得比较身高本身,选择更矮的。
───── ✨ 第27题 编程题2:数字替换 ✨ ─────
题目描述:将一个整数中所有的数字4替换为数字8,如果原数中没有4,则原样输出。
解题思路:
本题需要处理整数的每一位。由于整数可能很大(最大10^9),直接使用字符串处理是最简单的方法。但题目给出的参考程序是使用算术运算逐位处理,我们也讲解这种方法。
方法一:字符串替换(推荐,简单直观)
直接将整数转换为字符串,使用字符串的replace方法将'4'替换为'8',然后输出。注意:替换后可能带有前导零?但题目输入是正整数,且替换不会产生前导零。
方法二:算术运算逐位处理(参考程序方法)
1. 从个位开始,逐位分离原数num。
2. 如果当前位数字是4,则在新数中该位用8代替;否则,保留原数字。
3. 将处理后的数字重新组合成新的整数。
4. 注意重新组合时,需要根据位数乘以相应的10的幂次。
参考代码实现(方法二,遵循题解):
num = int(input()) # 保存输入的数
new_num = 0 # 4被替换为8的新数
loop_count = 0 # 循环次数,决定当前是10的几次方
while num > 0:
digit = num % 10 # 取出当前个位
if digit == 4:
digit = 8 # 替换
# 将处理后的数字放到新数的正确位置上
new_num += digit * (10 ** loop_count)
num //= 10 # 去掉已处理的个位
loop_count += 1
# 注意:如果原数是0,上述循环不会执行,new_num为0,但题目保证N>=1,所以没问题。
print(new_num)
优化后的简洁写法:
num_str = input()
new_str = num_str.replace('4', '8')
print(new_str)
复杂度分析:
- 时间复杂度:O(k),k为输入整数的位数(最多10位)。
- 空间复杂度:O(1)(算术方法)或 O(k)(字符串方法,用于存储字符串)。
易错点提醒:
- 算术方法中,10 ** loop_count可能会随着循环次数增加而变得很大,但Python支持大整数,没问题。
- 注意循环终止条件num > 0,如果输入是0?题目数据范围N>=1,所以不会遇到。
- 字符串方法更简单,不易出错,推荐在考试中使用。
range()、int()、input()/print()等内置函数的行为。forward、left/right、goto、circle、write等常用函数,注意默认的画笔状态和坐标系。