Python 练习讲解 · 06 / 25

枚举法:逐个检查三位数

把所有可能答案列出来,再用条件筛选;计算机擅长做这种不漏项的检查。

要学习的知识点

题目

练习 6:枚举各位数字互不相同且能被 7 整除的三位数。

参考程序:ex06.py;空白练习:lx06.py。

完整代码

以下内容与 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 不包含在序列里。

算法原理:候选不遗漏

  1. 先定义答案列表 answers,用来收集找到的数字。
  2. range(100, 1000) 生成 100–999。Python 的 range 不包含停止值 1000。
  3. 拆出百、十、个位,检查整除条件和数字不同条件。
  4. 符合就 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 连接。这样调试时能判断到底是哪项条件出了问题。

代码如何运行

  1. 先按左侧题目给出的格式输入数据;程序通过 input() 读取,并在需要时转换数据类型。
  2. 程序自上而下执行语句;遇到条件、循环或函数调用时,按照右侧算法说明更新变量和处理数据。
  3. 最后由 print() 输出计算结果。可将左侧示例输入与输出逐项对照。

先自己跟踪一组小数据,记录循环前后变量的值;这比只看最终答案更容易理解程序。

自己动手试一试

把能被 7 整除改成能被 9 整除,或者将三位数改成四位数,检查枚举范围是否完整。

先在 lx06.py 中独立完成,再运行参考程序比较结果。修改程序时一次只改一个条件或步骤。