Skip to content

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<=2400.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)

课程资料由授课教师、助教与同学共同积累。