要学习的知识点
- 枚举法与候选范围
- 三位数拆位
- 整除和取余
- 集合去重
- 布尔条件组合
题目
练习 6:枚举各位数字互不相同且能被 7 整除的三位数。
完整代码
以下内容与 ex06.py 一致,可对照右侧讲解阅读。
"""练习 6:枚举各位数字互不相同且能被 7 整除的三位数。
学习说明:
- range(100, 1000) 依次产生所有三位数,1000 不会被包含。
- // 和 % 分别用于拆出百位、十位、个位。
- number % 7 == 0 检查能否被 7 整除;集合长度为 3 检查三个数字互不相同。
- 满足两个条件的数加入答案列表;最后输出所有答案和答案个数。
"""
answers = []
for number in range(100, 1000):
hundreds = number // 100
tens = number // 10 % 10
ones = number % 10
if number % 7 == 0 and len({hundreds, tens, ones}) == 3:
answers.append(number)
print(*answers)
print("count:", len(answers))
进阶写法
这版与初学版解决同一道题,使用更精炼的语法或标准库工具。
进阶源码:ex06_adv.py
"""练习 6 进阶版:用列表解析和字符集合枚举符合条件的三位数。"""
answers = [
number for number in range(100, 1000)
if number % 7 == 0 and len(set(str(number))) == 3
]
print(*answers)
print("count:", len(answers))
列表解析把循环和条件筛选合在一起;str(number) 把数字转成字符,set() 删除重复数位,集合长度为 3 表示三位互不相同。
运行结果
示例输入:
(本题程序不需要输入)程序输出:
(此处省略较长的枚举结果,共 93 个候选数)
count: 93逐个认识函数
下表根据程序中实际调用的函数和方法整理;自定义函数的实现与算法细节见后续说明。
| 函数形式 | 功能与返回值 | 注意事项 |
|---|---|---|
list.append(item) | 在列表末尾追加一个元素;返回 None。 | 会原地修改列表。 |
len(container) | 返回字符串、列表、元组等对象的元素个数。 | 整数等没有长度的对象不能传入。 |
print(*objects, sep=' ', end='\n') | 把对象转换为文本显示;返回 None。 | 默认空格分隔并在末尾换行。 |
range(start, stop, step=1) | 产生整数序列供循环或索引使用。 | stop 不包含在序列里。 |
算法原理:候选不遗漏
- 先定义答案列表 answers,用来收集找到的数字。
range(100, 1000)生成 100–999。Python 的 range 不包含停止值 1000。- 拆出百、十、个位,检查整除条件和数字不同条件。
- 符合就 append;检查完全部候选后输出列表和长度。
这叫枚举或穷举:范围有限时,把候选一个个试。重要的是范围完整、判断条件准确。这里最多只检查 900 个数,工作量很小。
运算与函数
| 写法 | 作用及返回值 | 题中的要点 |
|---|---|---|
range(start, stop) | 产生从 start 开始、到 stop 之前的整数序列,可供循环使用。 | range(100, 1000) 不会漏掉 999,也不会检查 1000。 |
// | 整除运算符,返回商的向下取整结果。 | 126 // 100 得百位 1。 |
% | 取余运算符,返回除法余数。 | 126 % 10 得个位 6;余数为 0 表示整除。 |
set(iterable) / {a,b,c} | 构造集合,重复元素只保留一个。 | 三个数位放入集合后,len 等于 3 就说明没有重复。 |
len(obj) | 返回容器中元素个数。 | 检查数位集合大小。 |
list.append(value) | 将值放到列表末尾;修改列表,返回 None。 | 只把符合条件的 number 放入答案。 |
print(*answers) | 星号解包列表后逐个打印。 | 列表为空时也能正常输出空行。 |
拆位算例:126
百位:126 // 100 = 1
十位:126 // 10 % 10 = 2
个位:126 % 10 = 6
整除:126 % 7 = 0
集合 {1, 2, 6} 的长度 = 3先把每个条件单独写清楚,再用 and 连接。这样调试时能判断到底是哪项条件出了问题。
代码如何运行
- 先按左侧题目给出的格式输入数据;程序通过 input() 读取,并在需要时转换数据类型。
- 程序自上而下执行语句;遇到条件、循环或函数调用时,按照右侧算法说明更新变量和处理数据。
- 最后由 print() 输出计算结果。可将左侧示例输入与输出逐项对照。
先自己跟踪一组小数据,记录循环前后变量的值;这比只看最终答案更容易理解程序。
自己动手试一试
把能被 7 整除改成能被 9 整除,或者将三位数改成四位数,检查枚举范围是否完整。
先在 lx06.py 中独立完成,再运行参考程序比较结果。修改程序时一次只改一个条件或步骤。