- Python
Python 编程基础与算法实践学习笔记
- 2025-7-19 9:26:36 @
Python 编程基础与算法实践学习笔记
一、计算邮资(练18.4)
(一)题目需求
根据邮件重量和是否加急计算邮费:
- 重量 ≤1000 克,基础费 8 元;
- 重量 >1000 克,超 1000 克部分每 500 克(不足 500 克按 500 克算)加收 4 元;
- 加急(输入
y
)额外加 5 元。
(二)代码实现与注释
import math # 导入数学模块,用于向上取整函数 ceil
# 输入处理:获取重量 n(转换为整数)和是否加急 y
n, y = input().strip().split()
n = int(n)
cost = 0 # 初始化邮费为 0
if n <= 1000: # 重量在 1000 克及以内
cost = 8 # 基础费 8 元
else: # 重量超过 1000 克
# 计算超重部分:(n - 1000) 是超出 1000 克的重量
# math.ceil 向上取整,确保不足 500 克按 500 克算,再乘以 4 是超重费,加 8 是基础费
cost = math.ceil((n - 1000) / 500) * 4 + 8
if y == 'y': # 如果选择加急
cost += 5 # 加急费加 5 元
print(cost) # 输出最终邮费
(三)代码逻辑说明
- 输入处理:用
input().strip().split()
拆分输入,int(n)
转重量为整数。 - 基础邮费判断:通过
if-else
区分 1000 克内、外的计费逻辑,math.ceil
处理超重部分的向上取整。 - 加急判断:额外
if
判断是否加急,满足则邮费加 5 元,最后输出结果。
二、计数问题(J0049)
(一)题目需求
统计 1 到 n
的整数中,数字 x
(0 - 9)出现的总次数。
(二)代码实现与注释
# 输入两个整数 n 和 x,分别表示范围上限和要统计的数字
n, x = map(int, input().strip().split())
count = 0 # 初始化计数器,记录 x 出现的次数
# 遍历 1 到 n 的每个整数
for i in range(1, n + 1):
bf = i # 备份当前数字,用于逐位判断
while bf > 0: # 当数字还有位数可判断时循环
# 判断数字最后一位是否等于 x
if bf % 10 == x:
count += 1 # 是则计数器加 1
bf //= 10 # 去掉数字最后一位,继续判断高位
print(count) # 输出 x 出现的总次数
(三)代码逻辑说明
- 输入处理:
map(int, input().strip().split())
快速获取并转换输入的两个整数。 - 遍历与逐位判断:外层
for
遍历 1 到n
,内层while
逐位拆解数字(bf % 10
取末位、bf //= 10
去末位),判断是否匹配x
并计数。 - 结果输出:循环结束后,
count
即为x
出现的总次数,打印输出。
三、不定方程求解(P219)
(一)题目需求
求不定方程 ax + by = c
的非负整数(x ≥ 0
,y ≥ 0
)解的组数。
(二)代码实现与注释
# 输入三个正整数 a、b、c,分别对应不定方程 ax + by = c 的系数和结果
a, b, c = map(int, input().strip().split())
count = 0 # 初始化解的组数计数器
# x 的可能取值范围:0 到 c // a(包含两端),因为 ax ≤ c → x ≤ c//a
for x in range(c // a + 1):
# y 的可能取值范围:0 到 c // b(包含两端),因为 by ≤ c → y ≤ c//b
for y in range(c // b + 1):
# 判断当前 x、y 是否满足方程 ax + by = c
if a * x + b * y == c:
count += 1 # 满足则解的组数加 1
print(count) # 输出不定方程非负整数解的组数
(三)代码逻辑说明
- 输入处理:同样用
map
快速获取并转换输入的三个整数。 - 双重循环枚举:外层
for
枚举x
的可能值(0
到c//a
),内层for
枚举y
的可能值(0
到c//b
)。 - 方程验证与计数:通过
if
判断ax + by == c
,满足则count
加 1 ,最终输出解的组数。
四、知识总结与拓展
- 基础语法巩固:
- 输入输出:
input()
读取、print()
输出,结合split()
map()
高效处理多数据输入。 - 流程控制:
if-else
分支处理条件判断,for
while
循环实现遍历、枚举逻辑。
- 输入输出:
- 算法思路提炼:
- 邮资计算:分段逻辑 + 数学函数(
math.ceil
)处理边界。 - 计数问题:逐位拆解数字,暴力枚举 + 条件判断统计目标数字。
- 不定方程:双重枚举可能的解,验证方程是否成立,适合小规模数值(题目限制
a,b,c ≤ 1000
)。
- 邮资计算:分段逻辑 + 数学函数(
- 拓展思考:
- 邮资计算可优化输入校验(如重量为非负整数);
- 计数问题处理极大
n
(如10^18
)时,暴力枚举会超时,需用数位 DP 等高效算法; - 不定方程若
a,b,c
范围扩大,双重循环效率低,可推导数学公式(如固定x
求y
是否为非负整数 )优化。
通过这几个题目,能实践 Python 基础语法,掌握简单算法逻辑,也为后续复杂编程问题打下基础,多练习、多拓展思路才能逐步提升编程能力~
0 条评论
目前还没有评论...