内容正文:
枚举算法
我手里有三把一模一样的钥匙,分别可以开教室、办公室、寝室的门。当我晚上回到寝室,该如何找到能开寝室门的钥匙呢?
每把都试一遍
试一试:用枚举法找出30以内能被7整除的数字
一一列举
逐一检验
枚举
筛选
一一列举1到30的每个数字,逐一检验除以7有没有余数
用枚举法找出300以内能被7整除的数字
一一列举1到300的每个数字,逐一检验除以7有没有余数
每秒运算33.86千万亿次
麻烦吗?
一一列举
逐一检验
分支
循环
枚举算法
枚举
筛选
枚举算法要注意的问题
不能遗漏任何一个正确解
尽可能地缩小解的列举范围,提高算法的效率
例举出300以内被7整除的所有的数,如何编程实现?
分析:
列举的范围是什么?
检验的条件是什么?
列举方式是什么?
n=0,1,2,···,300
被7整除的数:n%7==0
for循环
枚举算法
例举出300以内被7整除的所有的数,如何编程实现?
枚举算法
for i in range(301):
if i%7==0:
print(i)
编程推算单据中被涂抹数字。
有一张单据上有一个5位数的编号n,如图所示,其千位数和十位数处已经变得模糊不清,但是知道这个5位数是23的倍数。
现要设计一个算法,找出所有满足这些条件的5位数,并统计这些5位数的个数。
练习
列举的范围是什么?
检验的条件是什么?
列举方式是什么?
千位的数:i=0,1,···,9
十位的数:j=0,1,···,9
被23整除:
(20506+i*1000+j*10)%23==0
双重for循环,找出这些数并统计其个数count_1
编程推算单据中被涂抹数字。
练习
分析
count =0
# 循环i
#循环j
t=20506+i*1000+j*10
if t % 23 == 0:
count+=1; pr