内容正文:
3.3.2 枚举算法及其程序实现
小试牛刀
有一个趣味游戏,游戏规则如下:参与人员从第一个人开始从50开始快速地报数,若遇到7的倍数或者包含7的数字,则说“跳过”,若没有跳过,则该人淘汰。一直报数,直到只剩下一人,即为胜利者。你准备好了吗?
明枪易躲,暗箭难防啊!!!
2
枚举算法
基本思想:按照问题本身的性质,把问题所有可能的解一一列举,然后逐个判断每一个列举出来的可能解是否是问题真正的解,若是,采纳;否则,抛弃。
一一列举
逐个验证
循环结构
分支结构
解题思路:
逐一列举可能解的范围,这个过程用循环结构实现。
对每一个可能解进行验证,这个过程用分支结构实现。
3
刚才我们是如何找出所有需要跳过的数的?
思 考
取第一个数50 判断是否需要跳过
取第二个数51 判断是否需要跳过
取第三个数52 判断是否需要跳过
…… ……
取最后一个数n 判断是否需要跳过
一一列举
逐个判断
枚举算法
4
枚举算法
解题步骤:
1.确定可能解的范围(不可重复,也不可遗漏;尽可能缩小范围)
2.确定判断条件(Python表达式)
基本框架:(循环结构嵌套分支结构)
for (列举所有可能解):
if (判断条件):
输出该解或计数
5
1.输出50-100之间是7的倍数或者包含数字7的数,并输出一共有几个数
基础练习
抽象与建模:
(1)确定可能解(假设可能解为i)的范围:50-100
(2)确定判断条件:i是7的倍数或者i包含数字7
如何用Python表达式进行判断?
i%7==0 or i%10==7 or i//10==7
6
设
计
算
法
7
count=0
for i in :
if :
print(i,end=' ')
#填空3
print("一共找到"+str(count)+"个符合条件的数")
i%7==0 or i%10==7 or i//10==7
range(50,101)
count +=1
编写程序:
8
基础练习
2.有一个三位正整数,它有如下特点:
(1)偶数;(2)完全平方数;(3)比3的整数倍大1。
编程求解所有符合条件的数并输出结果。
抽象与建模:
(1)确定可能解的范围 i:
(2)确定判断条件:
100-999
i既是偶数又是完全平方数且比3的整数倍大1
9
设
计
算
法
如何修改流程图?
(1)确定可能解的范围:100-999
(2)确定判断条件:既是偶数又是完全平方数且比3的整数倍大1
10
尽可能缩小枚举范围
def my(x):
if :
f=True
else:
f=False
return f
for i in range(100,1000,2):
if :
print(i)
my(i) and i%3==1
x**0.5==int(x**0.5)
编写程序:
11
3.一个三位正整数,如果各个位上数字的三次方之和等于这个数本身,我们就称这个数为水仙花数。请编程找出所有的水仙花数。
(1)确定可能解的范围:三位正整数i:100-999
(2)确定判断条件:各个位上数字的三次方之和等于这个数本身
判断正解之前需要取出各个位上的数字
提取百位数字a:
提取十位数字b:
提取个位数字c:
i%10 或i%100%10
i//100
提高练习
抽象与建模:
i%100//10 或i//10%10
12
设
计
算
法
13
count=0
for i in :
a=i//100 #求三位数百位数字
b=i//10%10 #求三位数十位数字
c=i%10 #求三位数个位数字
if :
print(i)
count+=1
print("一个找到"+ +"个水仙花数")
range(100,999)
a**3+b**3+c**3==i
str(count)
编写程序:
14
5.一张纸上有个五位数密码,其中的千位数字和十位数字已经模糊不清,如图所示,已知这个数字是27或者37的倍数。请编程找到所有符合条件的密码。
进阶练习
解题步骤:
(1)确定可能解的范围:无法整体枚举
逐个枚举:千位:0-9,十位:0-9