还剩15页未读,继续阅读
本资源只提供10页预览,全部文档请下载后查看!喜欢就下载吧,查找使用更方便
文本内容:
Python程序设计实践教程》课程教案《课题趣味数字教学目的
1.现实生活中有许多有趣的数学问题经常有意识地寻找并解决这些问题可以增强逻辑思维能力,进而开发大脑,提高智力水平,同时使生活变得丰富多彩计算机就是帮助我们解决这些问题的强有力的工具
2.通过编写程序解决数学难题,可以减少我们在解题时遇到的烦琐而复杂的计算,把精力集中在解决具体问题的方法上,锻炼思考能力和逻辑思维水平,同时提高自身的编程水平和应用计算机解决实际问题的能力
3.本实验选取一些趣味数字编程实例,使读者了解数字的奇妙之处课型新授课课时4章安排2个课时教学重点重点通过编写程序解决数学难题,减少解题时遇到的烦琐而复杂的计算,把精力集中在解决具体问题的方法上,锻炼思考能力和逻辑思维水平,同时提高自身的编程水平和应用计算机解决实际问题的能力教学难点难点教学难点在于引导学生精准把握不同趣味数字(水仙花数、完全数、快乐数、不变初心数)的复杂判定规则,通过优化算法逻辑,高效实现对大量数字的准确判断,并能深入理解算法背后的数学原理与程序运行机制教学过程
1.教学形式讲授课,教学组织采用课堂整体讲授和分组演示
2.教学媒体采用启发式教学、案例教学等教学方法教学手段采用多媒体课件、视频等媒体技术板书设计本课标题趣味数字课次
0.5s=s+kreturn sdefdisplayn:#定义函数display printn,〃的因数和〃,〃l〃,end=〃〃for ain range1,500:#查找500以内的亲密数for bin rangea+1,500:if yza二二b andyz b==a:displayaprint〃二〃,bdisplaybprint〃二〃,aprint〃亲密数〃,a,bbreak实例18-3快乐数
1.题目描述快乐数Happy Number的特性是在给定的进位制下,求该数的各位数字的平方和,对得到的新数再次求各位数字的平方和,如此重复进行,最终的结果必定为1,例如28f22+82=68f62+8J100^12+02+02=132f3+23f12+32=10-12+02=1因此28和32是快乐数,不是快乐数的数称为不快乐数Unhappy Number,所有不快乐数的各位数字的平方和计算最后都会进入4fl6f37f58-89-145f42f20-4…的循环中
2.题目分析判断所给的数是否是快乐数,这与水仙花数和完全数类似,都是判断所给的数据是否符合某种定义当我们按照定义对快乐数进行判断时,只要出现4-16-37-58-89-145-42-20f4…的循环,即可判断这个数不是快乐数
3.算法设计我们采用除法和取模的方法来获得数字的每一位数字,再将各位数字进行平方和计算以上19为例,将〃除以10后求余,得到9;接着用10整除得到1接着进行平方和计算92+y=82,结果不为1,则继续对该数进行拆分计算,进行下一次循环;若平方和结果为1,则该数是快乐数;若平方利为[4,16,37,58,89,145,42,20]中的某一个数,则认为该数不是快乐数,跳出循环,结束计算
4.程序代码#sll8-
3.pydef isHappyn:while True:#主循环,不用规定循环结束条件sqrsum=0#初始化变量,用于储存计算结果while n0:#n的最小值为0,0时可省略sqrsum+=n%10**2n//-10if sqrsum==1:#如果符合快乐数的定义,返回Truereturn Trueelif sqrsum in[4,16,37,58,89,145,42,20]:return Falseelse:n=sqrsum#将前一次判断的值赋给n,进行下一次判断i=int inputifisHappyi:printTrueelse:printFalse,
5.运行结果输入样例如下19输出样例如下True
6.思考与讨论上面的程序所用的规律总结法过于抽象,要计算所有不快乐数的各位数字的平方和,最后进入4-16-37-58-89-145-42-20—4…的循环中只有遍历的数足够多才能得出这一规律下面介绍一种更加直观的解法我们直接按照定义遍历整数〃,将〃的各位数字提取出来进行平方再相加但是我们知道数值〃是不具有“遍历”这一属性的,不能直接遍历〃那要怎样才能遍历〃?我们可以使用str函数把〃转化为字符串,字符串具有遍历的属性,因此转换成字符串后就可以直接遍历〃了但字符串不能进行平方操作,所以我们又需要使用int函数将字符串转化成数值,这样就可以进行平方、求和等操作接着得到第一次判断的结果,我们只需要用递归算法再次调用用于判断的函数,再一次判断即可那么我们如何判断该数是否循环而不构成快乐数?如果构成循环,那么会在计算过程中出现重复的数字我们可以创建一个列表,记录每次判断产生的数值,如果为1即为快乐数,不为1则将其加入列表如果下一次判断得出的数值已在列表中出现,即为循环,不是快乐数def isHappyn:def countm:#m为字符串global flag#定义全局变量,确保在函数isHappy中能使用flag变量1st.appendintm#将m转换为数值result=0#初始化变量for i in rangelen m:#遍历mresult+二2#取出各位数字计算平方和if result==1:#满足快乐数的定义flag=1#将标记值设为1elif resultin1st:#判断计算出的数是否在列表内,是则不满足快乐数的定义flag=0#将标记值设为0else:count strresult#如果未能判断是否为快乐数,用递归算法再次判断1st=[]m=str n符串并赋给m#将n转换成字countm countprint1st#调用函数return flag二二1为1则返回True,否则返回False#如果flag的值i=int inputifisHappy i:printTrue,else:printFalse,
7.问题拓展11000以内的所有快乐数在下面的程序中,循环调用上面的isHappy函数for i in range1,101:ifisHappy i:print i,end二〃〃输出结果如下1710131923283132444968707982869194971002冰雹猜想任意给定一个自然数,若它为偶数则除以2,若它为奇数则乘3再加1,得到一个新的自然数,按照这样的方法计算下去,若干次后得到的结果必为1编写程序对冰雹猜想的正确性加以验证,代码如下a=int input〃请输入一个正整数〃b二aent=0print a,end二〃\t〃while a!=1:if a%2=1:a—a*3+1else:a=a//2printa,end=\t〃ent+=1print f〃正整数{b}算了{ent}次〃实例18-4不变初心数
1.题目描述“不变初心数”是指这样一种特别的数它分别乘
2、
3、
4、
5、
6、
7、
8、9时,所得乘积的各位数字之和不变例如18X2=36,3+6=9;18义3=54,5+4=9;…;18X9=162,1+6+2=9对于18而言,9就是它的“初心”本题要求判断任意一个给定的数是否有不变的“初心”在第一行中输入一个正整数〃〃W100,在随后的〃行中每行输入一个正整数对于每个输入的数字,如果它有不变的“初心”,就输出它的“初心”,否则输出“NO”
2.题目分析根据题目的要求,解决本题的关键是计算出整数a分别乘
2、
3、
4、
5、
6、
7、
8、9的结果并判断每位数字之和是否相同,若不相同,则跳出循环,并输出“NO”,反之则输出其“初心”
3.算法设计对于某个选定的数,先将其与2相乘,得到第一个初心数,并以此为基础,让其与其他初心数进行比较,同时将keyl的值赋给key2,防止在第一次判断后直接跳出循环
4.程序代码#sll8-
4.pyn二eval inputt=list#存储各个数是否为初心数keyl=0key2=0for iin range0,n:a=eval inputkeyl=0key2=0for j in range2,10:b=a*jkey2=0m=str bif j==2:for kin range0,lenm:keyl=keyl+b%10b=b//10key2=keyl#防止在第一次判断后直接跳出循环else:for kin range0,len m:key2=key2+b%10b=b//10if keyl!=key2:t.append〃N0〃breakelif keyl==key2and j==9:t.append keylfor iin t:print i#输出结果
5.运行结果输入样例如下4182569979288672输出样例如下9N036NO
6.思考与讨论上述程序将结果以列表的形式存储,也可以在输入每个数后进行判断,然后输出结果,相应的程序如下n=eval inputkeyl=0key2=0for iin range0,n:a=eval inputkeyl=0key2=0for jin range2,10:b=a*j key2=0m=str bifj==2:for kin range0,lenm:keyl=keyl+b%10b=b//10key2=keylelse:for kin range0,lenm:key2=key2+b%10b=b//10if keyl!=key2:print〃N0〃breakelif keyl=key2and j=9:print keyl
7.问题拓展若正整数〃是它的平方数的尾部,则称〃为同构数例如,6是其平方数36的尾部,76是其平方数5776的尾部,因此6与76都是同构数请编写一个程序,找出1000以内的同构数本题最直观的解法是使用枚举算法,在11000的止整数中进行〜搜索,判断每一个数是否是同构数,如果是则将其输出,如果不是则跳过此数,继续向下寻找,直到判断完这1000个数实验内容
1.挛生素数
2.三重回文数
3.歌德巴赫猜想的验证章节小结本章在“趣味数字”实验里,我们一同探索了水仙花数、完全数、快乐数与不变初心数通过编程实践,同学们掌握了各类趣味数字的判定方法,依据其独特定义,巧妙设计算法,实现对数字的筛选与验证在这个过程中,不仅强化了编程逻辑思维,还深入领略到数字蕴含的奇妙规律与数学之美这些趣味数字看似小众,却为大家打开了一扇通往数字世界奥秘的窗,激发了对数学与编程结合的探索热情,也为后续学习更复杂算法和数字理论奠定了基础课时安排授课方式理论课口讨论课口习题课口其他口学分|共2分任课授课对象普通高等院校学生教师
1.《Python程序设计实践教程》教材及参考资料
2.本教材配套视频教程及学习检查等资源
3.与本课程相关的其他资源教学基本内容教学方法及教学手段课程引入参考以下形式:数字看似平淡无奇,实则暗藏许多奇妙之处比如,在浩瀚L衔接导入的数字海洋里,有一类特殊的〃水仙花数〃像153,它的每一位
2.悬念导入数字的立方和,即13+53+33,恰好等于它本身153o这是不是很神
3.情景导入奇?还有〃完全数〃,6就是个完全数,它的所有真因子(即除自
4.激疑导入身以外的因子)
1、
2、3相加,结果正好是6o在日常生活中,我
5.演示导入们也能接触到数字规律的应用比如商品价格尾数的设置,就可
6.实例导入能涉及到数字心理学接下来,让我们一起探索〃水仙花数〃〃
7.其他形式完全数〃〃快乐数〃〃不变初心数〃等趣味数字,揭开数字背后隐藏的神秘面纱,感受数字世界的独特魅力与奥秘,开启这段充满惊喜的数字探索之旅实验18趣味数字
1.教学以学生学习教材的基本内实例18-1水仙花数容为主,系统全面地了解趣味数
1.题目描述字水仙花数也称为超完全数字不变数、自恋数、自基数、阿姆斯壮
2.整个教学过程中,各教学点可数、阿姆斯特朗数如果一个3位数等于它的3个数字的立方和,根据实际情况,进行拓展知识的那么该3位数就称为水仙花数例如「+53+33二153,因此153是讲解一个水仙花数编写程序,计算100999的所有水仙花数〜
2.题目分析根据水仙花数的定义,判断一个数是否为水仙花数,最重要的是把给出的3位数的个位数、十位数、百位数拆分出来,并求其立方和(设为s),若s与给出的3位数相等,则该3位数就是水仙花数,反之则不是
3.算法设计在for循环中,对每个整数逐个分解出其个位数、十位数、百位数,判断其立方和是否等于这个数本身,若等于则该整数是水仙花数具体判断过程如下
①将〃除以100,得出百位数九
②将hlOO/除以10,得出十位数/
③将〃对10取余,得出个位数上
④判断八j、攵的立方和是否等于在Python中,“〃”是一个算术运算符,表示整数除法,可以返回商的整数部分(向下取整);“犷’可以用来计算求模,即两个数相除后的余数#sll8-l.pyfor nin range100,1000:n//100二110n//10%n%
104.程序代码if n==i**3+j**3+k**3:printf{n}
5.运行结果
1533703714076.思考与讨论对于某一个数,拆分每个位置的数字的算法有很多种,可以根据不同情况选择不同的算法(对于同一问题,不同算法的效率有时会相差很多)
(1)方法一枚举算法for iin range1,10:for jin range0,10:for kin range0,10:if i*100+j*10+k==i**3+j**3+k**3:printi*100+j*10+k
(2)方法二用字符串索引for nin range100,1000:a=intstrn
[0]b=int strn
[1]c=intstr n
[2]ifa**3+b**3+c**3=二n:print n
(3)方法三用函数(输入a=3)def shuin:for iin range10**nT,10**n:m二n sum=0temp=iwhile m0:sum+=temp//10**m-1**ntemp%=10**m-1m-=l if sum=二i:print ia=int inputshuia4方法四用列表1st二口for ABCin range100,1000:A,B,C=map int,str ABCifA*A*A+B*B*B+C*C*C==ABC:1st.appendstr ABCprint〃=joinlst
7.问题拓展一位数、两位数、四位数……是否有其相应的自幕数呢?自幕数是指一个〃位数,它的每位数字的〃次方之和等于它本身水仙花数只是自幕数的一种,其他位数的自嘉数的名称如下一位自嘉数独身数四位自幕数四叶玫瑰数jk----五位自幕数五角星数六位自嘉数六合数七位自累数北斗七星数八位自幕数八仙数九位自幕数九九重阳数十位自幕数十全十美数1四叶玫瑰数按照从小到大的顺序输出所有四叶玫瑰数每个数字一行,代码如下for iin range1000,10000:a=i//1000b=i//100%10c=i%100//10d=i%10if a**4+b**4+c**4+d**4=二i:print i由题意得知,循环范围是10009999,用if语句进行判断,输〜出结果下面采用另一种判断方法for iin range1000,9999:#四叶玫瑰数是四位数,因此在[1000,9999]范围内循环a=i//1000#将千位数的值赋给变量ab=i%1000//100#将百位数的值赋给变量bc=i%100//10#将十位数的值赋给变量cd=i%10#将个位数的值赋给变量dm=pow a,4+powb,4+powc,4+pow d,4#将各位数的四次方累加if m==i:#判断是否为四叶玫瑰数print i2求所有自嘉数程序代码如下部分省略print〃独身数:0123456789〃#所有一位数都是独身数,直接输出for iin range100,9999999999:#从100到9999999999循环if i==100:print〃水仙花数,end=〃if i==1000:print〃〃,end二〃\n〃print〃四叶玫瑰数〃,end=〃〃if i==100000000:print〃〃,end二〃\n〃print〃十全十美数:〃,end二〃〃n=lenstr i#与水仙花数同理s=0for jin stri:s+二intj**nif s==i:print s,end=/,〃该程序的计算量太大3基于循环计算自幕数下面的算法可以计算任意范围只要不超过Python整数的取值范围内的自基数end=intinput请输入最大范围for iin range1,end+1:length=lenstri#计算数字i的长度sm=0temp=ifor jin rangelength:sm+=temp%10**length#先求出个位,再进行累加temp II-10#以止匕类推,下一次获取百位、千位上的数if sm==i:#判断是否为自幕数print i这个算法与前面的算法基本相似,只是这个算法需要通过循环依次求余来获取个位、十位、百位、千位……上的数4通过遍历字符串计算自累数下面的程序是对前一个程序修改后的结果,不再使用求余、整除算法来计算个位、十位、百位……上的数字,而是通过遍历字符串来获取个位、十位、百位……上的数字end=int input请输入最大范围for iin range1,end+1:length=lenstri#计算数字i的长度sm=0#将i转换成字符串,通过遍历字符串来获取每位数字for jin stri:sm+二ordj-ord Olengthifsm--i:#判断是否为自幕数print i5利用列表推导式计算自幕数采用一个嵌套的列表推导式来判断自毫数,代码如下end=int input请输入最大范围It=[j for jin range1,end+1ifsum[ordi-ordO**lenstr jfor iinstr j]=j]print It6函数写法下面的代码从100开始遍历循环def daffodilnum,i:〃〃〃求正整数各个位置的数的i次方和自幕数param num正整数param i输入的数为几位数return返回整数各个位置的数的i次方〃〃〃total=0while num0:total+=num%10**inum//-10return totalimporttimeif_name_二二_main_:start time=time.time for iin range100,10000000:if daffodili,lenstr i=i:print i,end=end time=time,time printprint f‘运行时间{end_time-start time}s运行结果如下1533703714071634820894745474892727930845488341741725421081898008179926315运行时间
25.68394708633423s这个程序只能计算7位数以内的整数,若计算10位自然数,运行时间会大大增加7提示
①在编写程序的过程中,我们需要不断调试、不断优化
②由本例可知,一个问题可能有多种算法在日常生活中,我们需要不断观察学习,善于思考,不断学习新知识实例18-2完全数
1.题目描述完全数又称为完美数或完备数,是一种特殊的自然数它的所有真因数即除了自身的因数的和恰好等于它本身例如6=1+2+3,其中
1、
2、3为6的因数本实例要求编写程序,找出任意两个正整数之间的所有完全数C1输入格式在一行中输入2个正整数力和〃1〈加W〃10000,中间用空格分隔2输出格式逐行输出给定范围内每个完全数的因数累加形式的分解式,每个完全数占一行,格式为“完全数二因数1+因数2+…其中完全数和因数均按递增顺序输出若区间内没有完全数,则输出“None”
2.题目分析根据完全数的定义,解决问题的关键是计算所选取的整数,].的取值范围不固定的因数,将各因数累加变量s,若s等于7,则可确认I.是完全数,反之则7不是完全数
3.算法设计本题的关键是求出数值].的因数,即从1到片1范围内能整除了的数判断某个数J是不是/的因数,可利用语句ifi%j=O进行判断求某个数的所有因数,需要在1到范围内进行遍历,采用循环语句实现因此,本题从整体上看可利用两层循环实现外层循环时].的范围为[/〃,加;内层循环时J的范围为[1,7-1],代码形式如下for iin rangem,n+1:•••for jin range1,i:•••ifs=i:输出当前i是完全数对于某个选定的数,将求得的各因数累加变量s,初值为0之后,s的值发生改变若直接将下一个选定数的因数加到s上,得到的值并非所求此时s的初值不是0而是上一个选定数的因数之和因此每次判断下一个选定数之前,必须将变量s的值重新置为
04.程序代码#sll8-
2.pyimport mathm,n=mapint,input.split#输入n的值count=0#i控制选定数的范围,j控制除数范围,s记录累加因数之和foriin rangem,n+1:s=0#保证每次循环时s的初值为0yinzi=口for jin range1,i:if i%j=0:s=s+jyinzi.append jif i==s:#判断因数和是否与原数相等count+=lprint z/%d二l%i,end二for kin yinzi[1:len yinzi]:print+%d%k,end=print ifcount==0:printNone程序流程图如图18-1所示
5.运行结果
(1)输入样例230
(2)输出样例6=1+2+328=1+2+4+7+
146.思考与讨论
(1)完全数的性质
①它们都能写成连续自然数之和,例如6=1+2+328=1+2+3+4+5+6+7496=1+2+3+…+30+31
②它们的全部因数的倒数之和都是2,例如1/1+1/2+1/3=21/1+1/2+1/4+1/7+1/14+1/28=23除6以外的完全数可以表示成连续奇数的立方和,例如28=13+33496=13+33+53+734它们都可以表示为2的一些连续正整数次方之和,例如6=242228=22+23+24
(2)亲密数亲密数又称为相亲数、友爱数、友好数,是指两个正整数彼此的全部因数之和(本身除外)与另一方相等例如220和
284、1184和
1210、2620和
2924、5020和
5564、6232和6368o8UU力II」图18-1”程序流程图毕达哥拉斯曾说“朋友是你灵魂的倩影,要像220与284一样亲密”人与人要讲友情,有趣的是,数与数也有类似的关系,数学家把一对存在特殊关系的数称为“亲密数”亲密数是数论王国中的一朵小花,它有漫长的发现历史和动人的传说数学家在漫长的时间里,在前人的基础上不断更新方法,陆续找到了许多对亲密数到了1923年,数学家麦达其和叶维勒汇总了前人的研究成果与自己的研究成果,发现了1095对亲密数,其中最大的数有25位数字同年,另一位荷兰数学家里勒找到了一对有152位数字的亲密数人们发现,亲密数的个数越来越少,数位越来越大同时,数学家还发现,若一对亲密数的数值越大,则这两个数之比越接近于1这是亲密数的规律吗?人们期盼着最终的结论计算机的诞生结束了笔算寻找亲密数的历史有人利用计算机对所有IO,以下的数逐一进行了检验,共找到了42对亲密数,发现IO,以下的数中仅有13对亲密数但因计算机功能与数学方法的局限,目前还没有重大突破目前的研究主要有两方面寻找新的亲密数、寻找亲密数的表达公式
7.问题拓展上述程序在求某数的因数时,在[1,片1]范围内进行遍历这种方法可以做到没有遗漏,但效率不高对于某一整数,来说,其最大因数为7/2若/为奇数则最大因数小于〃2,在范围内没有数可以整除此数据此,我们可以把遍历范围缩小为[1,”2],这样程序效率可以提高一倍import mathm,n=mapint,input.split count=0foriin rangem,n+1:lstl=[l]forjinrange2,intmath.sqrti+l:if i%j==0:Istl.appendjif i//j notin Istl:Istl.appendi//j Istl.sortfactorsum=sum Istlifi==factorsum:count+=lprint stri+z,=〃+〃+〃・joinmapstr,Istlif count=0:printNone找出500以内的全部亲密数def yzn:#定义函数,求n的因数和s二0for kinrange1,n:if n%k==0:。
个人认证
优秀文档
获得点赞 0