程序设计题解析
第1题:回文数判断与生成¶
题目: 编写程序,判断一个整数是否为回文数,并找出指定范围内的所有回文数。
方法1:数值反转法(最直观)
方法2:半数反转法(优化版)
🔑 知识点
| 知识点 | 说明 |
|---|---|
n % 10 |
取出整数末位数字 |
n // 10 |
去掉整数末位数字 |
| 反转数字 | rev = rev * 10 + n % 10,逐位构建 |
| 边界条件 | 负数不是回文数;个位数是回文数;末尾为0的非零数不是回文数 |
| 半数反转 | 只需反转一半即可判断,效率更高 |
反转数字过程图解(以 121 为例):
📖 拓展
📌 记忆要点
-
数字反转核心:
rev = rev * 10 + n % 10,配合n //= 10 -
回文数判断:反转后与原数比较
-
负数、末尾为0的非零数不是回文数
-
半数反转法更高效,只反转一半即可判断
第2题:素数筛选与统计¶
题目: 编写程序,使用筛选法找出指定范围内的所有素数,并统计素数个数及占比。
方法1:逐个判断法(最直观)
方法2:埃拉托斯特尼筛法(高效)
🔑 知识点
| 知识点 | 说明 |
|---|---|
| 素数定义 | 大于1的自然数,只能被1和自身整除 |
int(n ** 0.5) + 1 |
只需判断到 sqrt(n),大幅减少循环次数 |
| 筛法原理 | 从2开始,将每个素数的倍数标记为非素数 |
i * i 起始 |
筛法中从 i*i 开始标记,因为更小的倍数已被更小的素数筛掉 |
| 列表推导式 | [n for n in range(...) if condition] 简洁筛选 |
筛法过程图解(limit = 10):
📖 拓展
📌 记忆要点
-
判断素数:只需除到
sqrt(n),注意 0 和 1 不是素数 -
筛法核心:标记倍数,从
i*i开始(更小的倍数已被筛掉) -
筛法效率远高于逐个判断,适合大范围找素数
-
列表推导式可简洁地筛选满足条件的元素
第3题:数字拆分与重组¶
题目: 编写程序,对输入的正整数进行数字拆分、排序和重组操作。
方法1:数值运算法(最直观)
方法2:字符串转换法(更简洁)
🔑 知识点
| 知识点 | 说明 |
|---|---|
n % 10 |
取末位数字 |
n // 10 |
去掉末位数字 |
digits.reverse() |
列表原地反转,无返回值 |
sorted(str(n)) |
对字符串排序,返回字符列表 |
''.join(list) |
将字符列表拼接为字符串 |
str(n)[::-1] |
字符串反转的惯用写法 |
int(ch) / str(d) |
数字与字符互转 |
数字拆分过程图解(以 52341 为例):
📖 拓展
📌 记忆要点
-
数字拆分核心循环:
digits.append(n%10)+n//=10,最后reverse() -
字符串方法更简洁:
str(n)→ 排序/反转 →int()还原 -
sorted(s, reverse=True)降序,sorted(s)升序 -
str(n)[::-1]是字符串反转的标准写法
第4题:字符串加密与解密¶
题目: 编写程序,实现两种字符串加密方式,并支持对应的解密。
方法1:基础实现(最直观)
方法2:使用 str.maketrans 和列表推导式
🔑 知识点
| 知识点 | 说明 |
|---|---|
ord(ch) |
获取字符的 ASCII/Unicode 码值 |
chr(num) |
将码值转换为字符 |
% 26 |
模运算实现字母循环(Z 后回到 A) |
str.maketrans() |
创建字符映射表 |
str.translate() |
按映射表转换字符串 |
| 凯撒加密公式 | chr((ord(ch) - base + key) % 26 + base) |
| 反转加密 | 先反转字符串,再对每个字符 ASCII 操作 |
凯撒加密图解(key=3):
| Text Only | |
|---|---|
反转加密图解("Ab1"):
📖 拓展
📌 记忆要点
-
凯撒加密核心:
chr((ord(ch) - base + key) % 26 + base) -
解密 = 反向偏移:
encrypt(text, -key) -
% 26实现字母循环,处理 Z → A 的回绕 -
反转加密两步:先反转,再 ASCII 操作;解密反序
-
str.maketrans()+str.translate()是批量字符替换的高效方法
第5题:列表数据筛选与统计¶
题目: 编写程序,对一组学生成绩数据进行筛选、排序和统计分析。
方法1:基础循环与条件判断(最直观)
方法2:使用内置函数和排序(更简洁)
🔑 知识点
| 知识点 | 说明 |
|---|---|
max(lst, key=lambda) |
按指定条件取最大值 |
sorted(lst, key=lambda, reverse=True) |
按条件降序排序 |
| 列表推导筛选 | [x for x in lst if condition] |
sum(1 for ... if ...) |
统计满足条件的元素个数 |
sum(scores) / len(scores) |
计算平均值 |
f"{value:.1f}" |
保留1位小数格式化输出 |
| 多条件分支 | if/elif/else 实现等级划分 |
排序关键参数:
📖 拓展
📌 记忆要点
-
筛选:列表推导
[x for x in lst if condition] -
排序:
sorted(lst, key=lambda x: x[1], reverse=True)按值降序 -
统计个数:
sum(1 for x in lst if condition)或Counter -
最大/最小:
max(lst, key=lambda)/min(lst, key=lambda) -
及格率:
及格人数 / 总人数 * 100
第6题:斐波那契数列与最大公约数¶
题目: 编写程序,实现斐波那契数列生成和最大公约数/最小公倍数计算。
方法1:迭代法(最直观)
方法2:递归法与更相减损术
🔑 知识点
| 知识点 | 说明 |
|---|---|
| 斐波那契定义 | F(1)=1, F(2)=1, F(n)=F(n-1)+F(n-2) |
| 迭代法 | 用循环逐项计算,效率高,推荐使用 |
| 递归法 | 直接翻译数学定义,但效率低(大量重复计算) |
a, b = b, a + b |
Python 同时赋值,无需临时变量 |
| 辗转相除法 | gcd(a,b) = gcd(b, a%b),直到 b=0 |
| 更相减损术 | 大数减小数,直到两数相等 |
| LCM公式 | lcm(a,b) = a * b // gcd(a,b) |
辗转相除法图解(gcd(48, 36)):
斐波那契数列前10项:
📖 拓展
📌 记忆要点
-
斐波那契迭代法:
a, b = b, a + b,简洁高效 -
递归法虽直观但有大量重复计算,实际中不推荐
-
辗转相除法:
while b: a, b = b, a % b,最终 a 即为 GCD -
LCM =
a * b // gcd(a, b),注意先除后乘防溢出 -
斐波那契数列相邻项互素(GCD 始终为1)
第7题:CSV 文件读取与成绩排名¶
题目: 编写程序,从 CSV 文件中读取学生成绩,计算总分和平均分,按总分排名后写入新文件。
方法1:基础文件操作(最直观)
输出文件内容:
方法2:使用 csv 模块(更健壮)
🔑 知识点
| 知识点 | 说明 |
|---|---|
with open() |
上下文管理器,自动关闭文件 |
encoding='utf-8' |
中文文件必须指定编码 |
f.readline() |
读取一行(含换行符),常用于跳过表头 |
line.strip().split(',') |
去除空白后按逗号分割 CSV 行 |
csv.reader() |
csv 模块读取,正确处理引号内的逗号 |
csv.writer() |
csv 模块写入,自动处理特殊字符 |
sorted(lst, key=lambda, reverse) |
按指定字段降序排序 |
enumerate(lst, 1) |
带起始编号的遍历,用于生成排名 |
CSV 文件处理流程:
📖 拓展
📌 记忆要点
-
文件操作三步:
with open()→ 读写 → 自动关闭 -
读 CSV:跳过表头(
readline()或next(reader)),逐行解析 -
写 CSV:
csv.writer()比手动拼接更健壮 -
排序加排名:先
sort()再enumerate(students, 1) -
中文文件务必
encoding='utf-8',写 CSV 加newline=''
第8题:图案打印¶
题目: 编写程序,根据输入的行数 n,打印多种对称图案。
方法1:循环拼接法(最直观)
输出:
方法2:使用 center 方法(更简洁)
🔑 知识点
| 知识点 | 说明 |
|---|---|
'*' * n |
字符串重复,生成 n 个星号 |
' ' * n |
生成 n 个空格 |
str.center(width) |
字符串居中对齐,两侧填充空格 |
range(n-1, 0, -1) |
递减循环,从 n-1 到 1 |
| 菱形行数 | 2n - 1 行(n 行上半 + n-1 行下半) |
| 第 i 行星号数 | 实心:2i-1;空心:2个(首尾行1个) |
| 第 i 行前导空格 | n - i 个 |
菱形图案规律图解(n=3):
📖 拓展
📌 记忆要点
-
图案打印核心:分析每行的前导空格数和星号数与行号的关系
-
菱形规律:前导空格 =
n - i,星号数 =2 * i - 1 -
字符串乘法:
'*' * n生成 n 个星号,' ' * n生成 n 个空格 -
str.center(width)可简化居中对齐 -
菱形分两半:上半
range(1, n+1)递增,下半range(n-1, 0, -1)递减 -
空心菱形:首尾行 1 个星号,中间行 2 个星号 + 内部空格