外观
2026-计算概论C-py3-练习
题集链接
OpenJudge/计算概论C(py)/2026-计算概论C-py3-练习共 11 题。练习题的完整参考解析可直接查看。
01:判断子串
题目描述
输入两行字符串,要求判断第一行 字符串是不是第二行的子串
输入
两行字符串。字符串长度不超过100。
输出
如果第一行是第二行的子串,就输出 "YES",否则输出"NO"
样例输入
hello world
this is hello world, it is ok.样例输出
YES提示
python中每使用调用一次 input(),就输入一行的内容。输入内容有几行,就要用几次 input()
来源
Guo Wei
解题提示
本题知识点: 字符串成员判断。
完整读入两行,使用 in 判断第一行是否在第二行中。
易错点
不要用 split 破坏句中的空格;判断方向是第一行在第二行中。
题解
思路
完整读入两行,使用 in 判断第一行是否在第二行中。
知识点
字符串成员判断第2章基本数据类型
代码(陈旭峥)
python
part = input()
text = input()
print("YES" if part in text else "NO")02:阶梯电价
题目描述
某市为提倡居民节约用电,电价实施“阶梯电价”。每户居民一个电表,电价分为三个“阶梯”:第一档,月用电量小于等于240千瓦时的,电价为0.48元;第二档,月用电量大于240小于等于400的,超出的部分电价标准比第一档电价提高0.05元/千瓦时;第三档,月用电量大于400千瓦时的,超出的部分电价标准比第一档电价提高0.3元/千瓦时。根据用户输入的月用电量(单位为千瓦时),输出该用户应支付的电费(元),结果四舍五入保留两位小数。
| 用电量x | 电价 | |
| 第一档 | x<=240 | 0.48 |
| 第二档 | 240<x<=400 | 超出的部分电价标准比第一档电价提高0.05 |
| 第三档 | 400<x | 超出的部分电价标准比第一档电价提高0.3 |
输入
用电量,float型
输出
电费,结果四舍五入保留两位小数
样例输入
300.00样例输出
147.00解题提示
本题知识点: 多分支与浮点数格式。
按 240、400 两个分界点分段,只对超出部分使用高档单价。
易错点
第二档单价是 0.53,第三档是 0.78;不能把全部电量都乘最高档单价。
题解
思路
按 240、400 两个分界点分段,只对超出部分使用高档单价。
知识点
多分支与浮点数格式第3章程序的控制结构
代码(陈旭峥)
python
x = float(input())
if x <= 240:
cost = x * 0.48
elif x <= 400:
cost = 240 * 0.48 + (x - 240) * 0.53
else:
cost = 240 * 0.48 + 160 * 0.53 + (x - 400) * 0.78
print(f"{cost:.2f}")03:数字反转
题目描述
给定一个整数,请将该数各个位上数字反转得到一个新数。新数也应满足整数的常见形式,即除非给定的原数为零,否则反转后得到的新数的最高位数字不应为零(参见样例2)。
输入
输入共 1 行,一个整数N。
-1,000,000,000 ≤ N≤ 1,000,000,000。
输出
输出共 1 行,一个整数,表示反转后的新数。
样例输入
样例 #1:
123
样例 #2:
-380样例输出
样例 #1:
321
样例 #2:
-83来源
NOIP2011复赛 普及组 第一题
解题提示
本题知识点: 字符串切片与整数转换。
先保存正负号,再反转绝对值的数字串,转回整数去掉前导零。
易错点
负号不参与反转;与作业 2 的三位数字符串不同,本题不能保留前导零。OJ 把两组样例放在同一块,样例标签不是输入。
题解
思路
先保存正负号,再反转绝对值的数字串,转回整数去掉前导零。
知识点
字符串切片与整数转换第3章程序的控制结构
代码(陈旭峥)
python
n = int(input())
result = int(str(abs(n))[::-1])
print(-result if n < 0 else result)04:密码是否合法
题目描述
某App要求用户设置的密码符合如下规则:密码字符串中只能包含数字、大写字母、小写字母、符号“+”、符号“-”、符号“=”。请编写程序,输入一个字符串,判断该字符串是否符合以上规则,若符合则输出“y”,否则输出“n”
输入
SDFdf=asdf12300+++---
输出
y
样例输入
SDFdf=asdf12300+++---样例输出
y解题提示
本题知识点: 循环与逻辑运算。
逐字符检查是否属于 ASCII 数字、英文字母或三个允许的符号。
易错点
只允许 +、-、=,不要求三类字符都出现;isalnum 也接受部分非英文字母,不适合直接表达这里的范围。
题解
思路
逐字符检查是否属于 ASCII 数字、英文字母或三个允许的符号。
知识点
循环与逻辑运算第3章程序的控制结构
代码(陈旭峥)
python
password = input()
valid = True
for ch in password:
if not ("0" <= ch <= "9" or "A" <= ch <= "Z" or "a" <= ch <= "z" or ch in "+-="):
valid = False
break
print("y" if valid else "n")05:求整数的和与均值
题目描述
读入n(1 <= n <= 10000)个整数,求它们的和与均值。
输入
输入第一行是一个整数n,表示有n个整数。
第2~n+1行每行包含1个整数。每个整数的绝对值均不超过10000。
输出
输出一行,先输出和,再输出平均值(保留到小数点后5位),两个数间用单个空格分隔。
样例输入
4
344
222
343
222样例输出
1131 282.75000来源
习题(8-6)
解题提示
本题知识点: for 循环与累加。
读 n 个整数累加,均值用总和除以 n。
易错点
输入数据每行一个整数;均值固定保留五位小数。
题解
思路
读 n 个整数累加,均值用总和除以 n。
知识点
for 循环与累加第3章程序的控制结构
代码(陈旭峥)
python
n = int(input())
total = 0
for _ in range(n):
total += int(input())
print(f"{total} {total / n:.5f}")06:计算各种符号的个数
题目描述
计算传入字符串中的数字、字母、空格和其他字符的个数
输入
一串字符串
输出
数字的个数
字母的个数
空格的个数
其他字符的个数
样例输入
1aB !@#$样例输出
1
2
3
4解题提示
本题知识点: 字符分类与计数。
完整读取一行,对每个字符按数字、字母、空格、其他四类之一计数。
易错点
input 后不要 strip,否则会丢失首尾空格;四个计数分别输出一行。这里只把普通空格归入空格类。
题解
思路
完整读取一行,对每个字符按数字、字母、空格、其他四类之一计数。
知识点
字符分类与计数第3章程序的控制结构
代码(陈旭峥)
python
text = input()
digits = letters = spaces = other = 0
for ch in text:
if ch.isdigit():
digits += 1
elif ch.isalpha():
letters += 1
elif ch == " ":
spaces += 1
else:
other += 1
print(digits, letters, spaces, other, sep="\n")07:整数序列的元素最大跨度值
题目描述
给定一个长度为n的非负整数序列,请计算序列的最大跨度值(最大跨度值 = 最大值减去最小值)。
输入
一共2行,第一行为序列的个数n(1 <= n <= 1000),第二行为序列的n个不超过1000的非负整数,整数之间以一个空格分隔。
输出
输出一行,表示序列的最大跨度值。
样例输入
6
3 0 8 7 5 9样例输出
9来源
改编自 元培-From Whf
解题提示
本题知识点: 列表、最大值与最小值。
读入第二行的整数序列,最大值减去最小值就是跨度。
易错点
序列只有一个数时结果为 0;跨度不是相邻元素之差。
题解
思路
读入第二行的整数序列,最大值减去最小值就是跨度。
知识点
列表、最大值与最小值第3章程序的控制结构
代码(陈旭峥)
python
n = int(input())
values = list(map(int, input().split()))
print(max(values) - min(values))08:角谷猜想
题目描述
所谓角谷猜想,是指对于任意一个正整数,如果是奇数,则乘3加1,如果是偶数,则除以2,得到的结果再按照上述规则重复处理,最终总能够得到1。如,假定初始整数为5,计算过程分别为16、8、4、2、1。
程序要求输入一个整数,将经过处理得到1的过程输出来。
输入
一个正整数N(N <= 2,000,000)
输出
从输入整数到1的步骤,每一步为一行,每一部中描述计算过程。最后一行输出"End"。如果输入为1,直接输出"End"。
样例输入
5样例输出
5*3+1=16
16/2=8
8/2=4
4/2=2
2/2=1
End提示
注意计算过程中中间值可能会超过int范围。
来源
6179
解题提示
本题知识点: while 循环与奇偶分支。
在 n 不等于 1 时按奇偶更新;每次更新前保存旧值以输出计算过程。
易错点
偶数用整数除法,过程不能出现 .0;输入 1 时直接输出 End。
题解
思路
在 n 不等于 1 时按奇偶更新;每次更新前保存旧值以输出计算过程。
知识点
while 循环与奇偶分支第3章程序的控制结构
代码(陈旭峥)
python
n = int(input())
while n != 1:
old = n
if n % 2:
n = 3 * n + 1
print(f"{old}*3+1={n}")
else:
n //= 2
print(f"{old}/2={n}")
print("End")09:回文子串
题目描述
给定一个字符串,输出所有长度至少为2的回文子串。
回文子串即从左往右输出和从右往左输出结果是一样的字符串,比如:abba,cccdeedccc都是回文字符串。
输入
一个字符串,由字母或数字组成。长度500以内。
输出
输出所有的回文子串,每个子串一行。
子串长度小的优先输出,若长度相等,则出现位置靠左的优先输出。
样例输入
123321125775165561样例输出
33
11
77
55
2332
2112
5775
6556
123321
165561来源
习题(12-6)
解题提示
本题知识点: 嵌套循环与字符串切片。
外层枚举长度(从 2 开始),内层从左到右枚举起点,比较子串与它的反转。
易错点
先按长度再按位置输出;不同位置出现相同回文仍要输出,不要去重。基础枚举法适合本题长度上限。
题解
思路
外层枚举长度(从 2 开始),内层从左到右枚举起点,比较子串与它的反转。
知识点
嵌套循环与字符串切片第3章程序的控制结构
代码(陈旭峥)
python
s = input()
for length in range(2, len(s) + 1):
for start in range(len(s) - length + 1):
part = s[start:start + length]
if part == part[::-1]:
print(part)10:鸡尾酒疗法
题目描述
鸡尾酒疗法,原指“高效抗逆转录病毒治疗”(HAART),由美籍华裔科学家何大一于1996年提出,是通过三种或三种以上的抗病毒药物联合使用来治疗艾 滋病。该疗法的应用可以减少单一用药产生的抗药性,最大限度地抑制病毒的复制,使被破坏的机体免疫功能部分甚至全部恢复,从而延缓病程进展,延长患者生 命,提高生活质量。人们在鸡尾酒疗法的基础上又提出了很多种改进的疗法。为了验证这些治疗方法是否在疗效上比鸡尾酒疗法更好,可用通过临床对照实验的方式 进行。假设鸡尾酒疗法的有效率为x,新疗法的有效率为y,如果y-x大于5%,则效果更好,如果x-y大于5%,则效果更差,否则称为效果差不多。下面给 出n组临床对照实验,其中第一组采用鸡尾酒疗法,其他n-1组为各种不同的改进疗法。请写程序判定各种改进疗法效果如何。
输入
第一行为整数n( 1 < n <= 20);
其余n行每行两个整数,第一个整数是临床实验的总病例数(小于等于10000),第二个疗效有效的病例数。
这n行数据中,第一行为鸡尾酒疗法的数据,其余各行为各种改进疗法的数据。
输出
有n-1行输出,分别表示对应改进疗法的效果:
如果效果更好,输出better;如果效果更差,输出worse;否则输出same
样例输入
5
125 99
112 89
145 99
99 97
123 98样例输出
same
worse
better
same解题提示
本题知识点: 分支与比例比较。
第一组是固定基准,后续每组与它比较。把有效率差是否超过 5% 化为整数交叉相乘比较,可避免边界浮点误差。
易错点
等于 5% 属于 same;不是把差除以基准有效率,不能更新基准。
题解
思路
第一组是固定基准,后续每组与它比较。把有效率差是否超过 5% 化为整数交叉相乘比较,可避免边界浮点误差。
知识点
分支与比例比较第3章程序的控制结构
代码(陈旭峥)
python
n = int(input())
base_total, base_effective = map(int, input().split())
for _ in range(n - 1):
total, effective = map(int, input().split())
difference = 20 * (effective * base_total - base_effective * total)
threshold = total * base_total
if difference > threshold:
print("better")
elif difference < -threshold:
print("worse")
else:
print("same")11:纸币换硬币
题目描述
用一张面值为x元的纸币换面值为y角、z角的硬币,每种硬币至少一枚,问有几种换法?请注意,纸币的单位是元,硬币的单位是角,一元等于10角。
输入
输入三个正整数x、y和z
输出
输出一个正整数,为换法的种数
样例输入
样例#1
1 2 5
样例#2
2 2 4
样例#3
3 4 6样例输出
样例#1
0
样例#2
4
样例#3
2提示
枚举y、z可能枚数的全部组合
解题提示
本题知识点: 枚举、整除与取余。
先将 x 元换成 10x 角,枚举第一种硬币的正整数枚数;剩余金额必须能整除第二种面值,且第二种至少一枚。
易错点
两种硬币都至少一枚;OJ 的样例标签不是输入内容,无方案时输出 0。
题解
思路
先将 x 元换成 10x 角,枚举第一种硬币的正整数枚数;剩余金额必须能整除第二种面值,且第二种至少一枚。
知识点
枚举、整除与取余第3章程序的控制结构
代码(陈旭峥)
python
x, y, z = map(int, input().split())
amount = 10 * x
count = 0
for first in range(1, amount // y + 1):
remaining = amount - first * y
if remaining >= z and remaining % z == 0:
count += 1
print(count)