• 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)  # 输出最终邮费

(三)代码逻辑说明

  1. 输入处理:用 input().strip().split() 拆分输入,int(n) 转重量为整数。
  2. 基础邮费判断:通过 if-else 区分 1000 克内、外的计费逻辑,math.ceil 处理超重部分的向上取整。
  3. 加急判断:额外 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 出现的总次数

(三)代码逻辑说明

  1. 输入处理map(int, input().strip().split()) 快速获取并转换输入的两个整数。
  2. 遍历与逐位判断:外层 for 遍历 1 到 n,内层 while 逐位拆解数字(bf % 10 取末位、bf //= 10 去末位),判断是否匹配 x 并计数。
  3. 结果输出:循环结束后,count 即为 x 出现的总次数,打印输出。

三、不定方程求解(P219)

(一)题目需求

求不定方程 ax + by = c 的非负整数(x ≥ 0y ≥ 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)  # 输出不定方程非负整数解的组数

(三)代码逻辑说明

  1. 输入处理:同样用 map 快速获取并转换输入的三个整数。
  2. 双重循环枚举:外层 for 枚举 x 的可能值(0c//a ),内层 for 枚举 y 的可能值(0c//b )。
  3. 方程验证与计数:通过 if 判断 ax + by == c ,满足则 count 加 1 ,最终输出解的组数。

四、知识总结与拓展

  1. 基础语法巩固
    • 输入输出:input() 读取、print() 输出,结合 split() map() 高效处理多数据输入。
    • 流程控制:if-else 分支处理条件判断,for while 循环实现遍历、枚举逻辑。
  2. 算法思路提炼
    • 邮资计算:分段逻辑 + 数学函数(math.ceil )处理边界。
    • 计数问题:逐位拆解数字,暴力枚举 + 条件判断统计目标数字。
    • 不定方程:双重枚举可能的解,验证方程是否成立,适合小规模数值(题目限制 a,b,c ≤ 1000 )。
  3. 拓展思考
    • 邮资计算可优化输入校验(如重量为非负整数);
    • 计数问题处理极大 n(如 10^18 )时,暴力枚举会超时,需用数位 DP 等高效算法;
    • 不定方程若 a,b,c 范围扩大,双重循环效率低,可推导数学公式(如固定 xy 是否为非负整数 )优化。

通过这几个题目,能实践 Python 基础语法,掌握简单算法逻辑,也为后续复杂编程问题打下基础,多练习、多拓展思路才能逐步提升编程能力~

0 条评论

目前还没有评论...