Skip to content

2026-计算概论C-py作业2 ​

题集链接 ​

OpenJudge/计算概论C(py)/2026-计算概论C-py作业2

共 7 题。题面、提示、易错点与完整参考解析均可直接查看,无需密码。

01:小树生长 ​

题目描述 ​

一棵小树高x米,如果每个月长高0.1米,一年(12个月)之后它有多高?如果它每个月长高10%,一年之后有多高?

输入

小树原来的身高height

输出

两行 每个月长高0.1米时一年后的身高h1(四舍五入保留一位小数) 每个月长高10%时一年后的身高h2(四舍五入保留两位小数)

样例输入

text
1

样例输出

text
2.2
3.14

解题提示

本题知识点: 第 2 章《基本数据类型》: 加法与乘法表示每月固定增加的量,** 表示逐月按比例增长;课件中的房租增长例子对比了这两种模型,f 字符串可分别控制两行的小数位数。

  1. 题目问的是两种互不相关的生长方式,先给它们分别命名,不要在第一种结果上继续计算第二种。
  2. 固定增长:每月增加原题给定的 0.1 米,重复 12 个月。百分比增长:每个月在当月高度的基础上乘以 1.1,重复 12 次。
  3. 分两行输出;第一种显示一位小数,第二种显示两位小数。样例初始高度为 1 时,分别是 2.2 和 3.14。

计算关键点: 两种增长对应不同关系,可先分别算两个中间量:

python
fixed = height + 12 * 0.1
compound = height * (1.1 ** 12)

第二式中的 ** 12 表示每个月在新高度上继续增长;输出时分别保留一位和两位小数。

易错点

  • 把复合增长当成加法: 初始高度 + 1.1¹² 少了对初始高度的乘法;初始高度 × (1.1 × 12) 也不是逐月增长。
  • 沿用第一种结果: 第二种方式应从原来的高度重新出发,而不是从固定增长后的高度出发。
  • 输出格式: 输出“第一种高度:”等文字、合并成一行,或小数位数不符,都会影响判题。

题解 ​

思路 ​

分别计算每月增加 0.1 米和每月增长 10% 时的一年后高度。

知识点 ​

数字类型-浮点型第2章基本数据类型

代码(徐志衡) ​

python
h = int(input())
h1 = h + 0.1 * 12
# **(幂运算)的运算符级别高于 *(乘法运算),因此不需要对幂运算使用括号
h2 = h * (1 + 0.1) ** 12
print(f'{h1:.1f}')
print(f'{h2:.2f}')

02:秒转时分秒 ​

题目描述 ​

输入一个以秒为单位的时间,换算成时分秒显示

输入

100

输出

0:1:40

样例输入

text
100

样例输出

text
0:1:40

解题提示

本题知识点: 第 2 章《基本数据类型》: 整除 // 求完整的小时或分钟,取余 % 求剩余秒数;每完成一次单位换算,就继续处理余数。

  1. 把总秒数看作若干个完整的 3600 秒,加上不到一小时的余数;前者就是小时数。
  2. 再从不足一小时的余数中,按 60 秒一组求分钟,最后剩下的是秒。框架:总秒数 → 小时与余数 → 分钟与余数 → 时:分:秒。
  3. 用 60、3600、3661 分别检查进位:秒和分钟都应保持在 0~59,输出形式为 1:1:1,无需补前导零。

进位关键点: 整除 // 取得完整单位,取余 % 保留不足一个单位的部分。可以把 3661 秒拆成 1 小时、余 61 秒,再拆成 1 分钟、余 1 秒。使用“先整除、再对剩余部分继续处理”的框架,就不会出现 1:61:1。

易错点

  • 分钟没有取余: 直接用 总秒数 ÷ 60 得到总分钟数,超过一小时后分钟会达到 60 或更大。
  • 小时算错: 把“剩余的秒”拿去除以 3600,或用秒数代替小时数,结果会偏差。
  • 输出拼接: 忘记两个冒号、用点号连接格式化参数,或额外补说明文字,都可能使结果不符合要求。

题解 ​

思路 ​

用整除和取余依次求小时、分钟、秒。

知识点 ​

数字类型-浮点型第2章基本数据类型

代码(徐志衡) ​

python
a = int(input())
h = a // 3600
m = (a % 3600) // 60
s = a % 60
print(f'{h}:{m}:{s}')

03:求三个数的和 ​

题目描述 ​

输入三个整数或小数,输出它们的和

如果结果是整数,就保留小数点后面一位的0

请注意:本题应该用float对三个数进行转换

输入

输入三个整数或小数

输出

和

样例输入

text
1 2.3 4.7

样例输出

text
8.0

解题提示

本题知识点: 第 1 章《程序设计与 Python 导引》: input() 一次读取整行。第 2 章《基本数据类型》: split() 把一行拆成多个字符串,float() 将各字段转为浮点数;浮点数求和后仍可能显示 .0。

  1. 看清输入布局:三个数用空格放在同一行,不是三行。先把这一行拆成三个字段,再逐个转成浮点数。
  2. 将三个浮点数相加。框架:读一行 → 拆成三段 → 转为 float → 求和 → 输出。
  3. 题目特别要求整数和仍带一位小数,例如 1 + 2.3 + 4.7 应显示 8.0。还应试一个非整数的和,避免把所有结果强制截成整数。

同一行由空格隔开的三个数,可以一次读入并转换:

python
a, b, c = map(float, input().split())

split() 先把一行拆成字符串,map(float, ...) 再逐个转为浮点数;这与连续调用三次 input() 不同。

结果关键点: 求和前让三个值都成为浮点数,求和后仍保留浮点结果。8.0 与 8 在题目要求下不是同一种输出;也不要把所有结果统一格式化成一位小数,否则非整数结果可能被改动。

易错点

  • 读取次数: 多次提交连续调用三次 input();输入其实只有一行,第二次读取就可能遇到 EOF,造成 Runtime Error。
  • 类型转换: int('2.3') 无法处理小数;不转换而直接相加则变成字符串拼接。
  • 结果格式: 整数和输出 8 会丢掉 .0;在已经是 8.0 的字符串后再拼 .0 又会得到 8.0.0。

题解 ​

思路 ​

把三个数转为浮点数后求和,输出保留浮点形式。

知识点 ​

数字类型-浮点型第2章基本数据类型

代码(徐志衡) ​

python
# Solution 1
# 使用 map 函数将输入的字符串转换为浮点数 float类型
x, y, z = map(float, input().split())
a = x + y + z
# 强烈推荐使用 is_integer() 方法判断浮点数是否为整数
if a.is_integer():
    print(f'{a:.1f}')
else:
    print(a)

04:计算句子中的单词个数 ​

题目描述 ​

输入一句英文句子,求这句话中的单词的个数

输入

teacher assistance is so handsome

输出

5

样例输入

text
teacher assistance is so handsome

样例输出

text
5

解题提示

本题知识点: 第 2 章《基本数据类型》: split() 按空白把句子分成单词列表,len() 统计列表中的单词数;len(原句) 得到的则是字符数。

  1. 一次读取整句英文,不要逐词调用输入函数。单词之间由空白分隔。
  2. 思路是“整句 → 按空白拆成单词列表 → 统计列表长度 → 只输出数量”。默认按空白拆分能处理连续空格。
  3. 除了样例,再试一句含多个空格的短句,确认统计的是单词数,不是字符数或空格数。

这题先取得单词列表,后续再统计列表长度:

python
words = input().split()

注意是 split(),有括号才会真正调用这个方法。

统计关键点: split() 返回的是单词列表;len(...) 要作用在这个列表上,而不是原句上。例如:

python
words = "one  two three".split()
print(len(words))  # 3

默认的 split() 会把连续空白视为分隔,不需要逐个数空格。

易错点

  • 统计对象错: len(整句) 得到字符数,整句.count(' ') 在连续空格时也不能直接代表单词数。
  • 方法未调用: 把 split 当成列表,却没有写调用所需的括号,后续求长度会报错。
  • 输出方式: 用 input(...) 代替 print(...) 输出,或在数字前多放一个空格,都会导致错误。

题解 ​

思路 ​

用 split() 按空白分词,再统计词数。

知识点 ​

数字类型-浮点型第2章基本数据类型

代码(徐志衡) ​

python
s = input().split()
print(len(s))

05:反向输出一个三位数 ​

题目描述 ​

将一个三位数反向输出。

输入

一个三位数n。

输出

反向输出n。

样例输入

text
100

样例输出

text
001

解题提示

本题知识点: 第 2 章《基本数据类型》: 字符串是有顺序的字符序列,切片 [::-1] 可以倒序取出字符;把结果转成整数会丢失开头的零。

  1. 这里要保留的是三位字符,不只是一个整数值。先按字符串读取输入,再考虑三个字符的逆序。
  2. 框架:读取三字符字符串 → 逆序排列字符 → 原样输出。无需对结果做数值运算。
  3. 特别检查 100 → 001:开头的两个 0 是答案的一部分。

字符串关键点: 三位数字在此题中更适合当作字符序列。Python 的 [::-1] 表示从末尾到开头取字符:

python
digits = "100"
print(digits[::-1])  # 001

反转后不要再转回整数,否则前导零会消失。

易错点

  • 前导零消失: 把输入或反转后的字符串转换为整数,会把 001 变成 1;这是旧提交中重复出现的 Wrong Answer。
  • 只处理数值: 用个位、十位、百位重新组成整数,数值可能对,但输出宽度不对。
  • 切片边界: 若使用字符串切片,检查是否真的取到全部三个字符,并且顺序反转。

题解 ​

思路 ​

把三位数当作字符串反向输出,保留前导零。

知识点 ​

数字类型-浮点型第2章基本数据类型

代码(徐志衡) ​

python
# Solution 1
s = input()
# .reverse()是原地修改列表,然而字符串是不可变的,所以字符串没有.reverse()方法
# reversed()函数反转字符串会生成新的变量的迭代器,通过 .join()方法将字符拼接为字符串
t = "".join(reversed(s))
print(t)

06:字符串中的整数求和 ​

题目描述 ​

输入两个长度为3的字符串,每个串前两个字符是数字,后一个字符是字母。 求这两个串中的整数的和

输入

一行,两个字符串

输出

两个字符串中整数的和

样例输入

text
12B 34D

样例输出

text
46

解题提示

本题知识点: 第 2 章《基本数据类型》: split() 分离一行中的两个字段,切片 [:2] 从每个字段取前两位,int() 转成整数后再用 + 求和。

  1. 一行中有两个用空格隔开的三字符字符串,例如 12B 34D;先把这一行拆成两段。
  2. 每段只取前两位数字,分别转换为整数,再计算两数之和。末尾字母不参与运算。
  3. 可以用样例拆开检查:12B 提供 12,34D 提供 34,输出只应是最终的一个整数。

两个字符串在同一行,可先用空格拆开,随后再分别截取前两位:

python
left, right = input().split()

截取关键点: 先把两个三字符字段拆开,再对每一个字段取前两位:

python
left = "12B"
print(left[:2])       # 12(字符串)
print(int(left[:2]))  # 12(整数)

两个前缀都转换成整数后才能做数值求和;末尾字母不参与。

易错点

  • 按两行读取: 两次调用 input() 会在单行输入时遇到 EOF,这类 Runtime Error 在旧提交中很多。
  • 截取范围: 把整个 12B 交给 int() 会报错;只取一个数字又会算错。
  • 拼接与变量名: 两个前缀还是字符串时用 + 会拼成 1234;结果变量大小写不一致也会报错。

题解 ​

思路 ​

分别提取两个字符串的前两位,转换为整数后求和。

知识点 ​

数字类型-浮点型第2章基本数据类型

代码(徐志衡) ​

python
a, b = input().split()
# 通过切片取字符串前两位并用 int()函数转换为整数
x = int(a[:2])
y = int(b[:2])
print(x + y)

07:字母加密 ​

题目描述 ​

英文小写字母构成一个封闭的环,输入密钥n,在环上按顺时针方向移动n步,得到加密后的字母。注意,密钥的取值范围不仅限于0~26。如输入英文小写字母a,密钥3,则加密后的字母为d;输入英文小写字母z,密钥1,则加密后的字母为a。输入英文小写字母a,密钥27,则加密后的字母为b。

输入

两行 第一行是英文小写字母 第二行是密钥

输出

加密后的字母

样例输入

text
a
2

样例输出

text
c

解题提示

本题知识点: 第 2 章《基本数据类型》: ord() 把字母转成编码,chr() 把编码转回字母;先换算成 0~25 的位置,再用 % 26 处理超过字母表末尾的情况。课件的凯撒密码是对应例子;读取顺序以本题题面为准。

  1. 第一行是小写字母,第二行才是密钥;按这个顺序读取。
  2. 把字母换成 0~25 的位置,加上密钥后对 26 取余,再换回字母。框架:字母 → 位置 → 向前移动 → 回到环内 → 字母。
  3. 用 z 移动 1 步应得到 a,用 a 移动 27 步应得到 b;这两组能检查环绕和大密钥。

这里恰好相反,两个值在不同的行,应按题目顺序各读一次:

python
letter = input()
key = int(input())

环绕关键点: 先把字母映射到 0~25,移动后用 26 取余,保证位置仍在字母环上:

text
新位置 = (旧位置 + 密钥) % 26

最后再把位置映射回小写字母。用 z + 1 和 a + 27 检查是否真的能绕回开头。

易错点

  • 输入顺序颠倒: 旧版解析或部分提交把密钥当作第一行,会导致转换错误;今年题面明确先字母、后密钥。
  • 只回绕一次: 位置超过 25 时只减一次 26,无法处理大于 26 的密钥;应考虑完整的环。
  • 取模对象错: 对密钥本身取模或忘记先减去 a 的编码,边界字符会输出错误;不要加“加密结果:”等文字。

题解 ​

思路 ​

利用字母的编码与取模实现环上的移动;先读字母,再读密钥。

知识点 ​

数字类型-浮点型第2章基本数据类型

代码(徐志衡) ​

python
letter = input().strip()
key = int(input())
shifted = (ord(letter) - ord('a') + key) % 26
print(chr(ord('a') + shifted))

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