要学习的知识点
- 离散计数
- 加法原理的互斥条件
- 乘法原理的分步条件
- 整数输入与类型检查
- 用小规模结果枚举核对
题目
补充练习:用实际选择问题分别演示加法原理和乘法原理。
输入一行四个非负整数:两类互斥选项数量 a、b,以及两类可搭配选项数量 c、d。
完整代码
以下内容与 ex24.py 一致,可对照右侧讲解阅读。
"""补充练习:用实际选择问题分别演示加法原理和乘法原理。
输入一行四个非负整数:两类互斥选项数量 a、b,以及两类可搭配选项数量 c、d。
学习说明:
- 两类选择互斥、只能选其中一类时,用加法原理:总数为 a + b。
- 两个步骤都要完成、每个第一步选择都能配每个第二步选择时,用乘法原理:总数为 c * d。
- 输入检查保证数量非负,避免出现没有意义的负选择数。
"""
a, b, c, d = map(int, input().split())
if min(a, b, c, d) < 0:
raise ValueError("选项数量不能为负数")
print("addition principle:", a + b)
print("multiplication principle:", c * d)
进阶写法
这版与初学版解决同一道题,使用更精炼的语法或标准库工具。
进阶源码:ex24_adv.py
"""练习 24 进阶版:用解包、min 和算术表达式实现计数原理。"""
a, b, c, d = map(int, input().split())
if min(a, b, c, d) < 0:
raise ValueError("选项数量不能为负数")
print("addition principle:", a + b)
print("multiplication principle:", c * d)
map() 转换四个输入,解包后直接赋给变量;min() 一次检查所有数量是否非负。
运行结果
示例输入:
2 3 2 3程序输出:
addition principle: 5
multiplication principle: 6逐个认识函数
下表根据程序中实际调用的函数和方法整理;自定义函数的实现与算法细节见后续说明。
| 函数形式 | 功能与返回值 | 注意事项 |
|---|---|---|
ValueError(message) | 内置异常类型,用来表示参数值不符合要求。 | raise ValueError(...) 会立即抛错并停止当前程序流程。 |
input(prompt='') | 读取一行文本,返回 str;若提供 prompt 会先显示提示。 | 返回值默认是字符串,计算前通常要做类型转换。 |
str.split(sep=None) | 按分隔符拆分字符串,返回字符串列表。 | 默认按连续空白拆分并忽略首尾空白。 |
map(function, iterable) | 逐个应用函数,返回惰性迭代器。 | 常与 list() 一起使用以立即取得结果。 |
min(iterable) / min(a, b, ...) | 返回最小元素。 | 空可迭代对象且没有 default 时会报错。 |
print(*objects, sep=' ', end='\n') | 把对象转换为文本显示;返回 None。 | 默认空格分隔并在末尾换行。 |
两个生活模型
程序输入四个选项数量 a、b、c、d。前两类互斥,只选其一;后两项代表一个选择过程中的两个连续步骤。源码:ex24.py。
- 只能选饮料 A(a 种)或饮料 B(b 种):用加法原理,a+b 种。
- 先选上衣(c 种),再选裤子(d 种):每件上衣都能搭配每条裤子,用乘法原理,c×d 种。
原理的适用条件
| 原理 | 直观问题 | 公式 | 条件 |
|---|---|---|---|
| 加法原理 | 方案 A 或方案 B | a+b | 两个类别互斥,结果不会被重复数。 |
| 乘法原理 | 先做步骤 A,再做步骤 B | a×b | 每个 A 选择都能与 b 个 B 选择搭配。 |
不能看到“有两类”就随意相加,也不能看到“两个数字”就相乘。先辨认题意是“选一个类别”还是“完成多个步骤”。
程序使用的函数
| 函数/方法 | 参数与返回值 | 作用 |
|---|---|---|
input().split() | input 返回 str;split 默认按空白拆分并返回列表。 | 读取同一行四个数。 |
map(int, ...) | 逐项转换为整数,返回 map 迭代器。 | 转换 a、b、c、d。 |
min(a, b, c, d) | 内置函数,多个参数时返回最小值。 | 若最小值小于 0,说明至少一个选项数量为负。 |
raise ValueError(message) | 抛出值错误;程序不会继续执行后续代码。 | 拒绝负选项数量。 |
print(...) | 显示标签和结果,返回 None。 | 输出相加和相乘的计算结果。 |
用小数据枚举检查
a=2 类蓝色物品,b=3 类红色物品,互斥选一:2+3=5
c=2 件上衣,d=3 条裤子,搭配一套:
(上衣1,裤1) (上衣1,裤2) (上衣1,裤3)
(上衣2,裤1) (上衣2,裤2) (上衣2,裤3)
共 2×3=6 套先用很小的数量手工列举所有结果,再看公式是否重复或漏算。程序输入应为非负整数。
代码如何运行
- 先按左侧题目给出的格式输入数据;程序通过 input() 读取,并在需要时转换数据类型。
- 程序自上而下执行语句;遇到条件、循环或函数调用时,按照右侧算法说明更新变量和处理数据。
- 最后由 print() 输出计算结果。可将左侧示例输入与输出逐项对照。
先自己跟踪一组小数据,记录循环前后变量的值;这比只看最终答案更容易理解程序。
自己动手试一试
让某类选项数量为 0;说明为什么互斥方案相加、连续步骤相乘。
先在 lx24.py 中独立完成,再运行参考程序比较结果。修改程序时一次只改一个条件或步骤。