内容正文:
4.1 算法及其特征+枚举法
知 识 回 顾
计算机解决问题的过程:
2
知 识 回 顾
1. 什么是算法?
算法就是解决问题的方法和步骤。
2. 描述算法的方法有哪些?
自然语言
流程图
伪代码
程序代码
3
知 识 回 顾
2. 描述算法的方法有哪些?
自然语言
流程图
伪代码
程序代码
“伪代码”不是真正的代码,无法运行。它介于自然语言(英语、中文)和编程语言之间,目的是让人能理解算法的逻辑。
input(x)
if x能被2整除 then
输出x是偶数
else
输出x是奇数
4
一
算法的五大特征 P99
确切性
输出项
可行性
输入项
有穷性
算法必须能在执行有限个步骤之后终止。
算法中的每一次运算都有明确的定义,具有无二义性,并且可以通过计算得到唯一的结果。
算法一定要有输出,至少要有1个输出。任何算法都不能 “无功而返" 。
输入项。一个算法有0个或多个输入,以刻画运算对象的初始情况,所谓0个输入是指算法本身给出了初始条件。
算法中执行的任何计算都可以在有限时间内完成(也称为 有效性)。算法中的运算都必须是可以实现的。
5
一
算法的五大特征 P99
6
一
算法的五大特征 P99
求1+2+3+4+5的和
算法在有限步骤内一定会结束,循环只会执行 5 次,不会无限运行。
每一步操作都明确、无歧义:sum=sum+i、i=i+1
每一步都是简单的加减和判断,能实际执行。
有明确的初始数据:n=5—>0个输入
如果是n=int(input(“请输入n:”))—>1个输入
算法执行结束后,一定会输出一个结果 sum,满足至少一个输出。
7
课 堂 练 习
1、算法必须在执行有限个步骤之后终止,这体现了算法的( )
A. 确定性
B. 有穷性
C. 可行性
D. 健壮性
解析:
A 错误:确定性是指每一步操作含义明确,无二义性。
B 正确:有穷性指算法在有限步骤内必须结束,不能无限执行。
C 错误:可行性指每一步都能通过基本操作有效实现。
D 错误:健壮性不是算法五大基本特征,是程序设计中的性质。
B
8
课 堂 练 习
9
二
枚举法 P101
枚举法(穷举法):把所有可能情况一一列举,符合条件就保留,不符合条件就丢弃,直至找到所有符合条件的结果。(注意:不重复,不遗漏)
忘记密码逐个尝试
鸡兔同笼问题
猜数字游戏
查找罪犯指纹
....
生活中的枚举:
1、枚举算法基本思想:一 一列举、逐一检验
3、枚举法解决问题的一般结构:
2、枚举使用要点:确定枚举范围和验证条件
循环+判断
10
二
枚举法
1.要枚举的可能的情况是有限的,否则计算机在有效的时间内是无法完成计算的(有穷性)
2.要枚举的可能情况必须是确定的(确定性)
3.要枚举的可能情况是能够转换成计算机可计算的(可行性)
枚举法优点是:思路相对简单,易于理解。只要时间足够,并且结果可能的情况是确定的、有限的,我们就能编写一个程序将所有结果都找到,它利用的是计算运行速度快,精确度高的特点。
枚举法的适用条件:
11
三
用枚举法解决鸡兔同笼问题
运用电子表格求解鸡兔同笼
枚举法思想
鸡兔同笼,上有三十五头,下有九十四足,问鸡兔各几只?
思路:这里使用枚举法(穷举法),其实就是一个个验证,假设鸡有1只、2只、3只、4只......34只;计算鸡和兔脚的总数量;
当满足条件:脚的总数等于94,当前鸡和兔的数量为答案。
12
三
用枚举法解决鸡兔同笼问题
编程解决:鸡兔同笼,上有三十五头,下有九十四足,问鸡兔各几只?
1、确定枚举范围:
头数为35
脚数为94
tu兔数量:1~34只
(因为至少有一只兔、一只鸡)
2、明确检验条件:
鸡和兔的总脚数之和等于94
legs=tu*4 + (35-tu)*2
(兔脚总数)(鸡脚总数)
for tu in range(1,35):
if legs==94:
①求当前兔子数量下鸡和兔的总脚数
②判断脚数是否相等
如果相等,说明这时候穷举出来的鸡兔数是符合要求的
13
三
用枚举法解决鸡兔同笼问题
for tu in range(1,35):
legs=tu*4 + (35-tu)*2
if legs==94:
print(“兔有“,tu,“头”)
print(“鸡有“,35-tu,“头”)
完整代码:
14
四
用枚举法解决问题
题目:例举出所有的两位偶数。
分析:
穷举范围:两位数范围是10-99。利用range(10,100)可生成10-99的数字序列。
判断条件:偶数满足除以2的余数为0,满足 if i%2==0此条件,则i为偶数。
(满足 if i%2==1 i为奇数)
15
四
用枚举法解决问题
输出三位数的水仙花数。水仙花数是指一个n位数(n>=3),它的每个位上的数字的n次幂之和等于它本身。例如:13+53+33=153。(1+125+27=153)
已知条件:
三位数的水仙
花数满足:
X=a3+b3+c3
满足条件的所
有三位数
过程分析:
2.如何求解1个三位数X的各个数位:
a
b
c
a=X//100
b=X//10%10
c=X%10
百位
十位
个位
2.如何判断abc是否是水仙花数?
a3+b3+c3 X
?
分析问题
153=15*10+3,余数永远只能是 0~9,刚好就是个位数字。
==
比如153//100=1
417//100=4
153%10=3
153 // 10 = 15
原来的三位数153 → 变成两位数 15
15 % 10 = 5对新的两位数取余 10,取出最后一位,就是原来的十位 5。
1.三位数的范围从100-999,range(100,1000)
16
编写代码
将程序补充完整,判断一个三位数是否是水仙花数
for x in range(100,①):
a=x//100 #求百位上的数字
b=② #求十位上的数字
c=x%10 #求个位上的数字
if a**3+b**3+c**3==x: #**幂运算
print(③,"是水仙花数")
用枚举法解决问题
四
x//10%10
x
1000
17
四
用枚举法解决问题
第一个数100
第二个数101
第三个数102
……
第900个数999
100不是水仙花数
101不是水仙花数
102不是水仙花数
……
999不是水仙花数
列 举
验 证
枚 举 法:
鸡兔同笼问题
例举出所有的两位偶数
找出所有三位数的水仙花数
……
优点:比较直观,易于理解
缺点:效率比较低
把所有可能的答案一一列举
18
四
总 结
19
枚举算法
分析问题,确定枚举对象和范围
一一列举,逐一检验
(不重复,不遗漏)
注意枚举法的使用限制条件(有穷性/确定性/可行性)
设计算法
将流程图补充完整
四
用枚举法解决问题
四
b=x//10%10
a**3+b**3+c**3==x
20
$