《中职电子与信息:课时9 枚举算法及程序实现.docx》由会员分享,可在线阅读,更多相关《中职电子与信息:课时9 枚举算法及程序实现.docx(9页珍藏版)》请在taowenge.com淘文阁网|工程机械CAD图纸|机械工程制图|CAD装配图下载|SolidWorks_CaTia_CAD_UG_PROE_设计图分享下载上搜索。
1、课时9枚举算法及程序实现课时目标.掌握枚举算法的基本思想。2,掌握使用枚举算法解决实际问题的基本方法,并通过编写程序实现问题求解。Q知识梳理-课前自主预习一、枚举算法的基本思想枚举算法的基本思想是把问题所有可能的解 2,然后判断每一个列举出的 且能解是否为正确的解。枚举算法常用于解决是否存在或有多少种可能等类型的问题。二、枚举算法的基本框架.枚举算法三要素枚举范围、枚举对象、判断条件.基本框架循环结构分支结构枚举范围是用来表示枚举对象存在的一个连续区间,用循环结构语句实现。判断条件用来检测当前枚举的对象是否为问题的解。r例题精析-课堂重难突破一将 10 个数据 “12, 20, 15, 86,
2、 55, 69, 96, 35, 99, 72” 依次存放在列 表Listl中,使用如下Python程序段找出大于50的数的个数。Listl = 12, 20, 31, 86, 55, 69, 96, 35, 99, 72count=0key=5()for i in range(), 10):if:count + = 1print(大于50的个数为:,count)程序中划线处的代码应为()判断的字符为ch,因此处代码为ch in ss;当checkl、check2和check3的值均为True时,密码合法,其他情况均为不合法,根据if下面的print语句可知,if条件为密码不合法时的情况,因此
3、处代码为not(checkl and check2 andcheck3)0/历提升4.三次函数f(x)=|x3-2x2+3x-2的图像如下图所示。从图像中观察得到,在0, 4区间内,分别存在一个局部极大点P(在P附近的函 数值都小于f(P)和局部极小点Q(在Q附近的函数值都大于f(Q)o寻找P和Q 近似值的方法如下:在0, 4区间内,每间隔e(e=0.001)取一个值逐一进行枚举, 如果找到某个值X,能同时满足f(x)f(x呆和f(x)f(x+e),则X可作为P的近 似值;如果找到的某个值x,能同时满足f(x)f(xe)和f(x)vf(x+e),则x可作 为Q的近似值。请仔细阅读和分析寻找P、
4、Q近似值的方法和下列程序,在划线处填入合适代码, 将下列程序补充完整。def f(x):鱼 return fxe=0.001a=f(e) b=f(0)x = () while xa and bc:print(当x = ,x, 时,函数的极大值的近似值=,b)if :print(当x = ,x,时,”函数的极小值的近似值=,b) x = x+e划线处应填入的语句为:; 划线处应填入的语句为:; 划线处应填入的语句为:0 答案 fx = (x*3)/3 2*(x*2)+3*x 2 ba and bc a, b=b, c 解析 函数f(x)的功能是计算函数f(x)=|x32x2+3x 2的值,转换为
5、Python 表达式为 fx = (x*3)/3 2*(x*2) + 3*x 2,因此处代码为 fx = (x*3)/3 2*(x*2) + 3*x-2;根据题意可知,当b大于a并且同时大于c时,可求得极大 近似值b,当b小于a且同时小于c时,根据x可求得极小近似值b,因此处 代码为bva and bc;在寻找x的过程中,每寻找一次,需更新变量a、b的值, 分别将a、b的值更新为b、c的值,因此,处代码为a, b=b, co5.用Python程序实现统计随机数出现的次数。下面程序的功能是:首先随机产生 30个10, 99之间的不重复整数,并以每行10个输出在屏幕上,然后统计10, 19、20,
6、 29、90, 99各区间段的整数个数,并输出统计结果。程序运行 效果下图所示:3()个不重复的随机整数为:85 2() 78 44 2B 14 77 17 76 9857 )2 21 55 99 23 48 87 24 1546 38 88 82 71 47 89 94 45 61各区间段统计结果为:1() -19:420 - 29 : 530 - 39 : 140 - 49 : 550 - 59 : 260 - 69 : I70 - 79 : 48() - B9 : 590 - 99 : 3实现上述功能的程序如下,回答下列问题。import randomdef check(x):check
7、=Trueif _check = Falsereturn checklistl=list2=0*10n= 1while ncountB.ListlikeyD.Listl i0:ift% 10=2:k=Trueif k=True:s=s+lprint(包含2的整数共有:”,s)答案t=il = t7/10解析 本题程序采用了 for循环结构,在算法上运用了枚举算法。枚举每一个整 数i中是否包含数字字符2,判断整数i中是否包含数字字符2,使用了 while循 环,将整数i的每个数字分解出来并进行判断,由于整数i进行分解时会改变其 原来的值,为了不改变整数i的值,使用变量i的值赋给变量t,因此,处代
8、码 为1=每次取出整数t的个位数是否为数字字符2,因此每操作一次,需将t 的值整除1(),故处代码为-随堂检测课堂达标反馈.有一个八位数整数,该整数的特点如下:该整数以39开头;(2)该整数个位上的数字为6;(3)整数能被159和188整除。编写程序求出所有可能的整数并统计个数。实现上述功能的程序如下,请在程序 划线处填入合适的代码。listb = Ucount=0for i in range(0, 100000):x = 3900000006+i*10if:count=count + 1 for i in:print(lislbi)print(count)划线处应填入的语句为:; 划线处应填
9、入的语句为:; 划线处应填入的语句为:0 答案 x % 159= =0 and x %188= =0 listb.appcnd(x) range(0, count) 解析 由于密码的前两位是39,个位上的数字为6,因此只要枚举中间5位数字 即可,然后对整数x进行判断,若s能被159和188整除,则x就是满足要求整 数,将整数x存储在列表listb中,并进行计数。处代码表示条件“整数x能 被159和188整除吗? ,因此处代码为x% 159= =0 and x % 188= =0;处代码的功能是将整数x存储在列表listb中,因此处代码为listb.append(x);处循环的功能是输出列表li
10、stb中的元素,共有count个元素,索引号为0count 1,因此range的范围为0count,处代码为range(0, count)o.m钱买n鸡问题。用m元买n只鸡,公鸡5元一只,母鸡3元一只,小鸡1 元3只,输出用m钱买n鸡的所有方案及方案总数。编写程序实现上述功能,程序运行效果如下图所示。请输入钱:50请输入要买的鸡的数量:20方案1: 3 116方案2: 749共有方案数:2实现上述功能的程序如下,请在划线处填入合适的代码。count=0m = int(input(请输入钱:”)n = int(i叩ut(请输入要买的鸡的数量:)for i in range(m/5 + 1):fo
11、r j in range(m/3+1):k=Qif :count+ = 1print(方案,count,i, j, k)划线处应填入的语句为:; 划线处应填入的语句为:。 答案n-i-j 5*i + 3*j + k/3 = =m解析本题主要考查的是枚举算法的综合应用。本题的枚举对象有两个,分别是 公鸡和母鸡的数量,i表示公鸡的数量,j表示母鸡的数量,k表示小鸡的数量, 已知公鸡、母鸡和小鸡共有n只,因此处的代码为n ij;如果买公鸡、母 鸡和小鸡的钱正好是m元,表示当前的购买方案可行,则进行计数,并输出购 买方案,因此,处的代码为5封+3*j+k/3 = = m,需注意的是判断条件不能写 为
12、5*i + 3*j+k/3 = =m。-1巩固与提Hy课后提能训练一巩固1.遗忘的密码。小明的一张银行卡由于较长一段时间没有使用了,因此忘记了 密码。他只记得密码的一些零星信息:密码是六位数字,前面两位为59;密码的最后两位数字相同;密码能被12和38整除。编写程序求出所有可能的密码并统计个数,程序运行结果有下图所示。可能的密码有:、591888592344 592800 597588 598044 598500 密码数为:6实现上述功能的程序如下,请在程序划线处填入合适的代码。c=0print(可能的密码有:)for i in range(0, 10000): s=590000+iif :x
13、 = s%10一.if x= =y: prinl(s) 一一print(密码数为:”,c)划线处应填入的语句为:; 划线处应填入的语句为:; 划线处应填入的语句为:。 答案s%12=0 and s%38=0 y=s%100/10 或 y = s/10%10 c=c + 1 或 c+ = l解析 由于密码的前两位是59,因此只要枚举后4位,然后对整数s进行判断, 若s能被12和38整除,并且最后两位数字相同,则s是可能的密码。处代码 表示“整数s能被12和38整除吗? ,因此处代码为s%12=0 and s%38 =0; x是6位数s的个位数,y为s的十位数,因此处代码为y=s%100/10,
14、也可写为y = s/10%10;处代码表示对可能的密码进行计数,因此,应填入的 代码为c=c+lo2.黑洞数。黑洞数是指这样的整数:由这个数字每位上的数字组成的最大数减去 数字组成的最小数,它们的差等于原来的整数。例如3位黑洞数是495,因为954 -459=495, 4位数字的黑洞数是6174,因为7641 1467=6174。编写程序, 功能如下:输入整数n,输出3位n位整数中的黑洞数。程序运行效果如下图 所示。n = int(input(输入 n:)count=0for x in range(3, n+1):start = 10*(x 1)for i in range(start, en
15、d):#把数字转换字符后拼接,并按降序排列maxnum = ,z.join(sorted(slr(i), reverse=True)minnum = r,.join(reversed(maxnum) #将 maxnum 中字符升序排列后拼接 if dis=i:print(i)count=count+1prinl(count= +)划线处应填入的语句为:; 划线处应填入的语句为:; 划线处应填入的语句为: . 答案 end=10*x dis=int(maxnum) -int(minnum) str(count)解析 根据代码range(start, end)可知,长度为x位的整数范围为start
16、, end-1, 因此处代码end=10*x;处代码的功能是求最大数与最小数的差,根据if 语句可知,两数之差存储在变量dis中,因为maxnum和mirmum是数字字符串, 所以在求差之前应将其转换为整数类型,因此,处代码为dis=int(maxnum) 一 int(minnum); count用来计数,统计黑洞数的个数,由于输出时使用了 “ + ”后, 因此需将count转换为字符串型,即处代码为str(count)o3.某网站要求新注册用户的密码必须以字母开头,并且含有字母(区分大小写)、 数字和特殊符号(!、#、$、&、*,7个符号中只要有一个即可),密码长 度为818个字符。下列程序
17、的功能是判断用户输入的密码是否合法。请回答下列问题。password = input(please input password:)check 1= False #判断首字符和长度是否满足要求check2 = False #判断数字check3=False #判断特殊字符ss = ! #$%&*n = len(password)6if7n19and (a=ch=z or A=ch = Z):check 1 =Trueif check 1:for i in range( 1, n):ch = passwordif,0,v=ch=9:check2=Trucelif :check3=Trucif :
18、print(密码不合法)else:print(密码合法”)(1)若输入的密码为“mylo e9”,则判断结果为。(2)请在程序划线处填入合适的代码。划线处应填入的语句为:; 划线处应填入的语句为:; 划线处应填入的语句为:o 答案不合法(2)ch = password0ch in ss nol(checkl and check2 and check3)解析 由于密码“myk)e9”的长度只有7位,因此判断结果为“不合法”。(2)checkl的作用是判断首字符和长度是否满足要求,密码串的首字符为字符串 password中的第一个字符,即pass word 0,因此处代码为ch = passwordOJ; check3的作用是判断密码中是否包含特殊字符,特殊字符串存放在ss中,当前