外观
2026-计算概论C-py6-练习
题集链接
OpenJudge/计算概论C(py)/2026-计算概论C-py6-练习共 15 题。练习题的完整参考解析可直接查看。OJ 题集结束时间为北京时间 2027-01-31 00:00。
01:判断字符串是否为回文
题目描述
输入一个字符串,输出该字符串是否回文。回文是指顺读和倒读都一样的字符串。
输入
输入为一行字符串(字符串中没有空白字符,字符串长度不超过100)。
输出
如果字符串是回文,输出yes;否则,输出no。
样例输入
abcdedcba样例输出
yes解题提示
本题知识点: 字符串切片。
比较原字符串与逆序字符串是否相同;也可以从两端向中间逐对比较字符。
易错点
输出必须为小写 yes 或 no;一个字符本身也是回文。
题解
思路
比较原字符串与逆序字符串是否相同;也可以从两端向中间逐对比较字符。
知识点
字符串切片第6章组合数据类型
代码(2026 秋整理)
python
text = input()
print("yes" if text == text[::-1] else "no")02:统计成绩
题目描述
现在一位老师手中有若干名学生的语数英三科成绩的成绩单,求每位学生的总成绩、平均成绩,并输出。
输入
一个整数 n 表示学生数量。接下来有 n 行,表示成绩。每行对应一个学生,包含 3 个数,每个数用空格隔开,分别对应语数英三科的成绩。
输出
输出 n 行,每行两个数,分别表示总成绩和平均成绩,均保留1位小数。(格式:这两个数用一个空格隔开)
样例输入
# 样例 1
2
95 91.5 89
83.5 89 98样例输出
# 样例 1
275.5 91.8
270.5 90.2提示
获取输入代码
grade = []
n = int(input())
for i in range(n):
grade.append([float(g) for g in input().split(" ")])
grade 是一个储存成绩的二维列表,每个学生的成绩是一个列表
解题提示
本题知识点: 二维列表、浮点数格式化。
逐行读取三科成绩,求和后除以 3 得到平均分,两项都用固定一位小数格式输出。
易错点
成绩可能带小数,应转换为 float;直接 print(round(...)) 不一定体现你所需的输出格式。
题解
思路
逐行读取三科成绩,求和后除以 3 得到平均分,两项都用固定一位小数格式输出。
知识点
二维列表、浮点数格式化第6章组合数据类型
代码(2026 秋整理)
python
n = int(input())
for _ in range(n):
grades = list(map(float, input().split()))
total = sum(grades)
print(f"{total:.1f} {total / 3:.1f}")03:礼物分发
题目描述
新年即将来临,某学院要开联欢会,为每位同学准备了一个礼物,礼物多种多样,并且均已从1开始逐次编号。同学们入场时,随机抽取一个号码(最大值不会超过礼物的个数)。联欢会结束后,同学们可以凭自己手中号码,到兑奖处领取与自己号码编号相同的礼物。请你根据同学们的参会情况,给出礼物发放、剩余的情况。
输入
两行。第一行为礼物名称,其显示顺序代表着编号顺序;第二行为同学们抽到的领取礼物的号码。各行中的元素均以空格分隔。
输出
两行,第一行为已发出的礼物名称(按发放顺序显示),及发出总数;第二行为尚未发放的礼物名称(按字母序显示),及未发总数,如果礼物全部发完,则显示None 0。每行各元素间均以空格分隔。
样例输入
# 样例1
qianzibi shubiao wuxianerji qianzibi Upan shubiao chongdianbao yidongyingpan
1 5 7 8
# 样例2
qianzibi shubiao wuxianerji qianzibi Upan shubiao chongdianbao yidongyingpan
5 7 3 2 1 8 6 4样例输出
# 样例1
qianzibi Upan chongdianbao yidongyingpan 4
qianzibi shubiao shubiao wuxianerji 4
# 样例2
Upan chongdianbao wuxianerji shubiao qianzibi yidongyingpan shubiao qianzibi 8
None 0提示
已发、未发的礼物,分别用两个新列表存储
来源
lyqian
解题提示
本题知识点: 列表索引、排序。
按领取号码依次查询原列表,记录已领取的位置;再从原列表中挑出未领取的位置,按名称排序。
易错点
礼物编号从 1 开始,列表索引从 0 开始。不能按礼物名称去重,同名礼物可能有多份;全部领完时输出 None 0。
题解
思路
按领取号码依次查询原列表,记录已领取的位置;再从原列表中挑出未领取的位置,按名称排序。
知识点
列表索引、排序第6章组合数据类型
代码(2026 秋整理)
python
gifts = input().split()
numbers = list(map(int, input().split()))
given = [gifts[number - 1] for number in numbers]
claimed = set(numbers)
remaining = sorted(gift for number, gift in enumerate(gifts, 1)
if number not in claimed)
print(*given, len(given))
if remaining:
print(*remaining, len(remaining))
else:
print("None 0")04:找第一个只出现一次的字符
题目描述
给定一个只包含小写字母的字符串,请你找到第一个仅出现一次的字符。如果没有,输出no。
输入
一个字符串,长度小于100000。
输出
输出第一个仅出现一次的字符,若没有则输出no。
样例输入
abcabd样例输出
c解题提示
本题知识点: 字典计数、顺序遍历。
第一遍统计每个字符的次数,第二遍按原字符串顺序找第一个次数为 1 的字符。
易错点
不要按字母排序后再找,也不要对每个位置反复扫描全串;没有符合条件的字符时输出 no。
题解
思路
第一遍统计每个字符的次数,第二遍按原字符串顺序找第一个次数为 1 的字符。
知识点
字典计数、顺序遍历第6章组合数据类型
代码(2026 秋整理)
python
text = input()
counts = {}
for char in text:
counts[char] = counts.get(char, 0) + 1
for char in text:
if counts[char] == 1:
print(char)
break
else:
print("no")05:矩阵对角线求和
题目描述
矩阵表示可以理解为将一个 n*m 个数排列成 n 行 m 列。矩阵的主对角线指的是第 i 行,第 i 列的元素。比如下列的 3*3 矩阵:
1 2 3
4 5 6
7 8 9
主对角线为 1, 5, 9。给定一个 n*n 矩阵,计算主对角线元素的和。
输入
第一行为一个整数n
接下来的n行,是一个 n*n 矩阵,每个元素都是整数,范围是[0, 100],每个元素之间用空格分隔
输出
一个整数(主对角线元素的和)
样例输入
# 样例 1
3
1 2 3
4 5 6
7 8 9样例输出
# 样例 1
15提示
获取输入代码
n = int(input()) # n 为一个整数
mat = []
for i in range(n):
row =[int(number) for number in input().split()]
mat.append(row)
mat 是一个二维列表,储存矩阵的信息
解题提示
本题知识点: 二维列表、下标。
主对角线位置的行下标与列下标相同,只需累加每一行中对应下标的元素。
易错点
本题只求主对角线,不是两条对角线之和;下标从 0 开始。
题解
思路
主对角线位置的行下标与列下标相同,只需累加每一行中对应下标的元素。
知识点
二维列表、下标第6章组合数据类型
代码(2026 秋整理)
python
n = int(input())
total = 0
for i in range(n):
row = list(map(int, input().split()))
total += row[i]
print(total)06:摩斯密码
题目描述
摩斯密码加解密。
将英文单词(仅由英文字符组成的字符串,不区分大小写)加密成摩斯密码(每个字母的摩斯密码之间用"/"分隔)。或者将模式密码解码成英文单词(大写)。
输入
英文单词或者摩斯密码
输出
加密或者解密后的结果
样例输入
样例输入1:
.-././.../../.../-/.-/-./-.-././...
样例输入2:
counts样例输出
样例输出1:
RESISTANCES
样例输出2:
-.-./---/..-/-./-/...提示
需要自行判断输入是单词或还是摩斯密码。可以用x.isalpha()判断一个字符是否为字母。
输入部分代码提示:
line = input()
英文字母与摩斯密码的对应关系:
letterBook =
解题提示
本题知识点: 字典映射、字符串拼接。
建立字母到密码的映射及反向映射。英文输入先转成大写后逐字母查表,以斜杠连接;密码输入先按斜杠切分再查反向表。
易错点
加密结果的两端不加斜杠;解密结果用大写。样例中的说明文字不是实际输入。
题解
思路
建立字母到密码的映射及反向映射。英文输入先转成大写后逐字母查表,以斜杠连接;密码输入先按斜杠切分再查反向表。
知识点
字典映射、字符串拼接第6章组合数据类型
代码(2026 秋整理)
python
letters = "ABCDEFGHIJKLMNOPQRSTUVWXYZ"
codes = [".-", "-...", "-.-.", "-..", ".", "..-.", "--.", "....", "..", ".---",
"-.-", ".-..", "--", "-.", "---", ".--.", "--.-", ".-.", "...", "-",
"..-", "...-", ".--", "-..-", "-.--", "--.."]
encode = dict(zip(letters, codes))
decode = dict(zip(codes, letters))
text = input().strip()
if text.isalpha():
print("/".join(encode[char] for char in text.upper()))
else:
print("".join(decode[code] for code in text.split("/")))07:身份证有效性验证
题目描述
一个合法的中国居民身份证号码有18位,其中前6位为地区编号,第7-14位为出生日期,第15-17位为登记流水号,其中第17位是偶数为女性,是奇数则为男性,第18位为校验码。校验码的生成规则请见后面的备注。请设计编写程序,输入18位身份证,判断其合法性,此程序我们判断两个方面的合法性,一是长度是否是18位,并且前17位均为数字;二是判断最后一位校验码是否正确(注意处理字母大小写的问题);不判断地区、生日的合法性。如果输入的身份证非法,即上述的两个合法性至少一个不成立,那么输出 "illegal",否则输出对应的性别,"male" 或 "female"。
备注
身份证校验码生成规则:
将身份证17位本体码各位数字乘以对应加权因子并求和,除以11得到余数,根据余数通过校验码对照表查得校验码。
加权因子:
| 位置序号 | 加权因子 |
|---|---|
| 1 | 7 |
| 2 | 9 |
| 3 | 10 |
| 4 | 5 |
| 5 | 8 |
| 6 | 4 |
| 7 | 2 |
| 8 | 1 |
| 9 | 6 |
| 10 | 3 |
| 11 | 7 |
| 12 | 9 |
| 13 | 10 |
| 14 | 5 |
| 15 | 8 |
| 16 | 4 |
| 17 | 2 |
校验码:
| 余数 | 校验码 |
|---|---|
| 0 | 1 |
| 1 | 0 |
| 2 | X |
| 3 | 9 |
| 4 | 8 |
| 5 | 7 |
| 6 | 6 |
| 7 | 5 |
| 8 | 4 |
| 9 | 3 |
| 10 | 2 |
输入
一个字符串表示身份证号。
输出
一个字符串,"illegal" 或者 "male" 或者 "female"
样例输入
# 样例 1
388499298347485942
# 样例 2
21199303U3838949样例输出
# 样例 1
female
# 样例 2
illegal提示
获取输入代码
ID = input() # 身份证字符串
解题提示
本题知识点: 字符串校验、加权求和。
先检查长度和前 17 位数字,再按题面权重计算余数,查表核对末位校验码。全部通过后根据第 17 位的奇偶判断性别。
易错点
先判断合法性再转整数,末位 X 不区分大小写。题目明确不检查地区和出生日期,不能擅自增加限制。
题解
思路
先检查长度和前 17 位数字,再按题面权重计算余数,查表核对末位校验码。全部通过后根据第 17 位的奇偶判断性别。
知识点
字符串校验、加权求和第6章组合数据类型
代码(2026 秋整理)
python
identity = input().strip()
weights = [7, 9, 10, 5, 8, 4, 2, 1, 6, 3, 7, 9, 10, 5, 8, 4, 2]
check_codes = "10X98765432"
if len(identity) != 18 or not all("0" <= char <= "9" for char in identity[:17]):
print("illegal")
else:
total = sum(int(char) * weight for char, weight in zip(identity[:17], weights))
if identity[-1].upper() != check_codes[total % 11]:
print("illegal")
else:
print("male" if int(identity[16]) % 2 else "female")08:上机签到表
题目描述
小明是计算概论C课的助教,他准备了一张电子表格记录班上各位同学的签到情况,来计算大家的平时考勤分。但是电脑中毒后该文件出现了问题,签到记录顺序被打乱了,若干条记录也出现了重复的情况。请你帮助小明统计大家的平时成绩。
每一条签到记录包括:学生学号、签到的日期。
例如1900016673 10.18表示学号为1900016673的同学在10月18日有一次签到记录。
对于每位同学每次不重复的签到记录,记作平时分的1分,你需要按照从大到小的顺序给出同学的平时成绩(忽略没有签到记录的同学),如果成绩相同的,学号靠前的排在前面。
输入
第1行:一个正整数N,表示接下来有N条签到记录。
第2到N+1行:签到记录,一个整数学号和一个字符串日期,被空格隔开。
输出
若干行:每行是学号和该同学的平时成绩,用空格隔开。
样例输入
5
1900016673 10.18
1700014223 11.23
1800014741 9.13
1700014223 9.27
1900014150 9.27样例输出
1700014223 2
1800014741 1
1900014150 1
1900016673 1提示
注意签到记录中可能存在重复的情况
解题提示
本题知识点: 字典、集合、多关键字排序。
用学号映射到签到日期集合,集合大小就是分数。按分数降序、学号升序输出。
易错点
同一学号同一天的重复记录只算一次;日期保留字符串即可,不要转成浮点数。
题解
思路
用学号映射到签到日期集合,集合大小就是分数。按分数降序、学号升序输出。
知识点
字典、集合、多关键字排序第6章组合数据类型
代码(2026 秋整理)
python
n = int(input())
attendance = {}
for _ in range(n):
student, date = input().split()
attendance.setdefault(student, set()).add(date)
ranking = sorted(attendance, key=lambda student: (-len(attendance[student]), int(student)))
for student in ranking:
print(student, len(attendance[student]))09:校园食宿预订系统
题目描述
某校园为方便学生订餐,推出食堂预定系统。食宿平台会在前一天提供菜单,学生在开饭时间前可订餐。 食堂每天会推出m个菜,每个菜有固定的菜价和总份数,售卖份数不能超过总份数。 假设共有n个学生点餐,每个学生固定点3个菜,当点的菜售罄时, 学生就买不到这个菜了。 请根据学生预定记录,给出食堂总的预定收入 数据满足1 <= n <= 6000,3 <= m <= 6000,单品菜价不大于1000元,每个菜的配额不超过3000
输入
第一行两个整数n和m,代表有n个学生订餐,共有m个可选的菜
下面m行,每行三个元素,分别是菜名、售价和可提供量,保证菜名不重合,菜价为整数
下面n行,每行三个元素,表示这个学生点的三个菜的菜名
输出
一个整数,表示食堂的收入
样例输入
5 5
yangroupaomo 13 10
jituifan 7 5
luosifen 16 3
xinlamian 12 20
juruo_milktea 999 1
yangroupaomo luosifen juruo_milktea
luosifen xinlamian jituifan
yangroupaomo jituifan juruo_milktea
jituifan xinlamian luosifen
yangroupaomo yangroupaomo yangroupaomo样例输出
1157提示
如果用python做,要用字典,
如果用其它语言做,也要用类似的数据结构
否则会超时
名字长度范围没有给出,长度不会太离谱。请自己选用合适的办法确保这不是个问题
来源
李云涛
解题提示
本题知识点: 字典、库存模拟。
字典保存各菜品的价格与库存,按订单顺序逐项处理;有库存才计入收入并扣减一份。
易错点
同一学生可能连续点同一道菜,要逐份检查库存;售罄后不能继续计费。
题解
思路
字典保存各菜品的价格与库存,按订单顺序逐项处理;有库存才计入收入并扣减一份。
知识点
字典、库存模拟第6章组合数据类型
代码(2026 秋整理)
python
n, m = map(int, input().split())
menu = {}
for _ in range(m):
name, price, stock = input().split()
menu[name] = [int(price), int(stock)]
income = 0
for _ in range(n):
for name in input().split():
if menu[name][1] > 0:
income += menu[name][0]
menu[name][1] -= 1
print(income)10:病人排队
题目描述
病人登记看病,编写一个程序,将登记的病人按照以下原则排出看病的先后顺序:
老年人(年龄 >= 60岁)比非老年人优先看病。
老年人按年龄从大到小的顺序看病,年龄相同的按登记的先后顺序排序。
非老年人按登记的先后顺序看病。
输入
第1行,输入一个小于100的正整数,表示病人的个数;
后面按照病人登记的先后顺序,每行输入一个病人的信息,包括:一个长度小于10的字符串表示病人的ID(每个病人的ID各不相同且只含数字和字母),一个整数表示病人的年龄,中间用单个空格隔开。
输出
按排好的看病顺序输出病人的ID,每行一个。
样例输入
5
021075 40
004003 15
010158 67
021033 75
102012 30样例输出
021033
010158
021075
004003
102012来源
习题(14-6)
解题提示
本题知识点: 列表、稳定排序。
把老年人与其他病人分开,老年人按年龄降序稳定排序,之后接上保持登记顺序的非老年人。
易错点
60 岁属于老年人。病人 ID 用字符串保存以保留前导零;同龄老人不能按 ID 重新排序。
题解
思路
把老年人与其他病人分开,老年人按年龄降序稳定排序,之后接上保持登记顺序的非老年人。
知识点
列表、稳定排序第6章组合数据类型
代码(2026 秋整理)
python
n = int(input())
seniors = []
others = []
for _ in range(n):
identity, age = input().split()
age = int(age)
if age >= 60:
seniors.append((identity, age))
else:
others.append(identity)
seniors.sort(key=lambda patient: -patient[1])
for identity, age in seniors:
print(identity)
for identity in others:
print(identity)11:选课系统
题目描述
新学期选课即将开始,每个同学一共有100点数可以分配,共有M门课程,每门课程有课程容量。假设共有N名学生参与选课,每个学生自由分配100点数给所选课程。
最终的选课结果由选课点数和学生学号决定:
选课点数高的学生优先选取该课;
选课点数相同时学号大的学生优先选取该课;(按照整数比大小)
现在请你帮忙查询一下同学们的最终选课结果
输入
第一行为整数M、N,M代表有M门课程,N代表有N名同学选课,T代表查询T位同学的选课结果。 1 ≤ M ≤ 1000,1 ≤ N ≤ 1000
下面M行,每行有两个元素,分别是课程名称和课程容量,容量为正整数
下面N行,每行第一个元素是学生学号,后面有偶数个元素,分别代表选课名称和分配点数
下面1行,每个元素为学号,共T个,以空格隔开 1 ≤ T ≤ M。表示查询该学号同学的选课结果
输出
共T行
每行输出对应同学选到的课程名称(按照最初M行课程输入的顺序输出),以空格隔开;如果没有选到课程输出None
样例输入
4 5
摸鱼学导论 3
恋爱分析 2
浑元形意太极拳 5
哲♂学导论 6
2100210001 摸鱼学导论 50 恋爱分析 40 浑元形意太极拳 10
2100210002 摸鱼学导论 50 浑元形意太极拳 5 哲♂学导论 45
2100210003 摸鱼学导论 80 恋爱分析 20
2100210004 恋爱分析 70 浑元形意太极拳 10 哲♂学导论 20
2100210005 摸鱼学导论 50 恋爱分析 50
2100210001 2100210003 2100210005样例输出
浑元形意太极拳
摸鱼学导论
摸鱼学导论 恋爱分析提示
一种可行的做法:
1.建立一个课程名字作为key,课程人数限制作为value的字典dict1。
2.建立一个课程名字作为key,选课学生信息列表(初始时为空列表)作为value的字典dict2,读取学生的选课信息,并把(意愿值,学号)这个元组不断加到dict2对应的课程选课学生列表中。最终,dict2中的每个value是一个列表,列表中储存着对应课程的所有选课学生信息。
3.对dict2中每门课的对应的值(即保存该课程所有选课学生信息的列表)进行排序(类似于前面电影排序那个题的排序方法);结合dict1并判断哪些学生选中了哪些没选中。把这些选中的信息储存在dict3中,dict3是一个以学号为key,选中课程名字列表为value的字典。
4.根据要查询的信息来检索dict3,并输出相应的结果。
样例输入下,建立的dict1为:
python
{'摸鱼学导论': 3, '恋爱分析': 2, '浑元形意太极拳': 5, '哲♂学导论': 6}dict2(未排序)为:
python
{'摸鱼学导论': [(50, 2100210001), (50, 2100210002), (80, 2100210003), (50, 2100210005)], '恋爱分析': [(40, 2100210001), (20, 2100210003), (70, 2100210004), (50, 2100210005)], '浑元形意太极拳': [(10, 2100210001), (5, 2100210002), (10, 2100210004)], '哲♂学导论': [(45, 2100210002), (20, 2100210004)]}dict3为:
python
{2100210001: ['浑元形意太极拳'], 2100210002: ['摸鱼学导论', '浑元形意太极拳', '哲♂学导论'], 2100210003: ['摸鱼学导论'], 2100210004: ['恋爱分析', '浑元形意太极拳', '哲♂学导论'], 2100210005: ['摸鱼学导论', '恋爱分析']}其他注意:
5.输入的每个学生选课门数不固定,可以用语句s=input().split()来读取,得到的s是一个列表,再处理列表中的数据。
6.本题目需要的步骤较多,如果代码出现问题,可以使用PyCharm的调试模式,或者使用print()语句输出中间变量,来检查代码中可能的bug。
解题提示
本题知识点: 字典分组、多关键字排序。
按课程汇总申请者,按点数和整数学号均降序排列,取容量内的学生。最后按最初的课程顺序整理每个学生选中的课程。
易错点
每条学生记录包含不定数量的课程与点数,要成对读取。第一行只有 M、N;查询人数由末行学号数量确定,没有选中课程时输出 None。
题解
思路
按课程汇总申请者,按点数和整数学号均降序排列,取容量内的学生。最后按最初的课程顺序整理每个学生选中的课程。
知识点
字典分组、多关键字排序第6章组合数据类型
代码(2026 秋整理)
python
m, n = map(int, input().split())
courses = []
capacity = {}
applications = {}
for _ in range(m):
name, limit = input().split()
courses.append(name)
capacity[name] = int(limit)
applications[name] = []
selected = {}
for _ in range(n):
fields = input().split()
student = fields[0]
selected[student] = []
for i in range(1, len(fields), 2):
applications[fields[i]].append((int(fields[i + 1]), int(student), student))
for course in courses:
applicants = sorted(applications[course], reverse=True)
for points, number, student in applicants[:capacity[course]]:
selected[student].append(course)
for student in input().split():
print(" ".join(selected.get(student, [])) or "None")12:异常细胞检测
题目描述
我们拍摄的一张CT照片用一个二维数组来存储,假设数组中的每个点代表一个细胞。每个细胞的颜色用0到255之间(包括0和255)的一个整数表示。我们定义一个细胞是异常细胞,如果这个细胞的颜色值比它上下左右4个细胞的颜色值都小50以上(包括50)。数组边缘上的细胞我们不检测。现在我们的任务是,给定一个存储CT照片的二维数组,写程序统计照片中异常细胞的数目。
输入
第一行包含一个整数N(100>=N>2).
下面有 N 行,每行有 N 个0~255之间的整数,整数之间用空格隔开。
输出
输出只有一行,包含一个整数,为异常细胞的数目。
样例输入
4
70 70 70 70
70 10 70 70
70 70 20 70
70 70 70 70样例输出
2来源
医学部计算概论2006期末考试题
解题提示
本题知识点: 二维列表、邻接判断。
只遍历非边缘位置,分别比较上下左右四个邻居;四个方向的差值都至少为 50 才计数。
易错点
比较方向是邻居比当前值大至少 50,恰好差 50 也满足;不要把边缘或斜对角细胞算进去。
题解
思路
只遍历非边缘位置,分别比较上下左右四个邻居;四个方向的差值都至少为 50 才计数。
知识点
二维列表、邻接判断第6章组合数据类型
代码(2026 秋整理)
python
n = int(input())
matrix = [list(map(int, input().split())) for _ in range(n)]
count = 0
for i in range(1, n - 1):
for j in range(1, n - 1):
value = matrix[i][j]
neighbors = [matrix[i - 1][j], matrix[i + 1][j],
matrix[i][j - 1], matrix[i][j + 1]]
if all(neighbor - value >= 50 for neighbor in neighbors):
count += 1
print(count)13:矩阵乘法
题目描述
计算两个矩阵的乘法。n×m 阶的矩阵 A 乘以 m×k 阶的矩阵 B,得到的矩阵 C 是 n×k 阶的,且:
text
C[i][j] = A[i][0] * B[0][j] + A[i][1] * B[1][j] + …… + A[i][m-1] * B[m-1][j]C[i][j] 表示 C 矩阵中第 i 行第 j 列元素。
输入
第一行为n, m, k,表示A矩阵是n行m列,B矩阵是m行k列,n, m, k均小于100
然后先后输入A和B两个矩阵,A矩阵n行m列,B矩阵m行k列,矩阵中每个元素的绝对值不会大于1000。
输出
输出矩阵C,一共n行,每行k个整数,整数之间以一个空格分开。
样例输入
3 2 3
1 1
1 1
1 1
1 1 1
1 1 1样例输出
2 2 2
2 2 2
2 2 2解题提示
本题知识点: 二维列表、三重循环。
结果中第 i 行第 j 列是 A 的第 i 行与 B 的第 j 列对应元素乘积之和,累加下标范围为 0 到 m−1。
易错点
结果为 n 行 k 列;每个结果元素独立初始化为 0,不能沿用上一列的累加值。
题解
思路
结果中第 i 行第 j 列是 A 的第 i 行与 B 的第 j 列对应元素乘积之和,累加下标范围为 0 到 m−1。
知识点
二维列表、三重循环第6章组合数据类型
代码(2026 秋整理)
python
n, m, k = map(int, input().split())
a = [list(map(int, input().split())) for _ in range(n)]
b = [list(map(int, input().split())) for _ in range(m)]
for i in range(n):
row = []
for j in range(k):
value = 0
for t in range(m):
value += a[i][t] * b[t][j]
row.append(value)
print(*row)14:生日相同
题目描述
在一个有180人的大班级中,存在两个人生日相同的概率非常大,现给出每个学生的学号,出生月日。试找出所有生日相同的学生。
输入
第一行为整数n,表示有n个学生,n<100。
此后每行包含一个字符串和两个整数,分别表示学生的学号(字符串长度小于10)和出生月(1<=m<=12)日(1<=d<=31)。
学号、月、日之间用一个空格分隔。
输出
对每组生日相同的学生,输出一行,
其中前两个数字表示月和日,后面跟着所有在当天出生的学生的学号,数字、学号之间都用一个空格分隔。
对所有的输出,要求按日期从前到后的顺序输出。
对生日相同的学号,按输入的顺序输出。
样例输入
5
00508192 3 2
00508153 4 5
00508172 3 2
00508023 4 5
00509122 4 5样例输出
3 2 00508192 00508172
4 5 00508153 00508023 00509122解题提示
本题知识点: 元组键、字典分组。
以月份和日期组成的元组为键,按输入顺序保存学号。日期键升序排列,只输出人数至少为 2 的组。
易错点
学号保留字符串以保留前导零;组内不排序,保持输入顺序。月份和日期按整数比较。
题解
思路
以月份和日期组成的元组为键,按输入顺序保存学号。日期键升序排列,只输出人数至少为 2 的组。
知识点
元组键、字典分组第6章组合数据类型
代码(2026 秋整理)
python
n = int(input())
birthdays = {}
for _ in range(n):
student, month, day = input().split()
date = (int(month), int(day))
birthdays.setdefault(date, []).append(student)
for date in sorted(birthdays):
students = birthdays[date]
if len(students) >= 2:
print(*date, *students)15:有效的数独
题目描述
数独是一种填数游戏,玩家需要根据9x9矩阵上的已知数字,填写出所有剩余空格的数字,填好后,需要满足每一行、每一列、每一个下图中3x3粗线框内均包含1~9这9个不同数字。

输入填好数后的9x9矩阵,判断其是否满足数独要求.
输入
第一行,输入一个小于15的正整数,表示有多少组输入数据
接下来每组测试数据是一个9x9的数字矩阵(元素值:1~9)
两组数据之间有一个空行
最后一组数据后面也有空行
输出
对每组数据,如果其满足数独要求,输出True,否则输出False
输出格式: #组号 True或False
样例输入
2
4 3 5 7 9 8 2 1 6
8 1 6 2 5 4 9 7 3
7 2 9 3 1 6 8 4 5
5 7 8 1 6 2 3 9 4
6 9 1 5 4 3 7 2 8
2 4 3 8 7 9 5 6 1
3 6 4 9 8 7 1 5 2
9 5 2 6 3 1 4 8 7
1 8 7 4 2 5 6 3 9
8 5 7 3 4 2 6 1 9
6 3 9 8 7 1 2 4 5
2 1 4 9 6 5 3 8 7
5 8 1 4 3 9 7 6 2
4 6 3 2 8 7 5 9 1
9 7 2 1 5 6 8 3 4
7 4 5 6 9 8 1 2 3
1 9 6 7 2 3 4 5 6
3 2 8 5 1 4 9 7 8样例输出
#1 True
#2 False来源
鲁东佑 gw班
解题提示
本题知识点: 集合、二维列表。
分别检查 9 行、9 列和 9 个 3×3 小方块,每组都应恰好包含数字 1 到 9。
易错点
不能只验证每行或各组的和。数据组之间有空行;输出前缀是 #组号,布尔值首字母大写。
题解
思路
分别检查 9 行、9 列和 9 个 3×3 小方块,每组都应恰好包含数字 1 到 9。
知识点
集合、二维列表第6章组合数据类型
代码(2026 秋整理)
python
import sys
values = iter(map(int, sys.stdin.read().split()))
cases = next(values)
expected = set(range(1, 10))
for case in range(1, cases + 1):
board = [[next(values) for _ in range(9)] for _ in range(9)]
valid = all(set(row) == expected for row in board)
for column in range(9):
valid = valid and {board[row][column] for row in range(9)} == expected
for top in range(0, 9, 3):
for left in range(0, 9, 3):
block = {board[row][column]
for row in range(top, top + 3)
for column in range(left, left + 3)}
valid = valid and block == expected
print(f"#{case} {valid}")