首页>动态>正文
素数判断代码实现及其优化
2023-08-06 07:33:43    来源:程序员客栈

说在前面


【资料图】

素数判断是经典数论问题,也是算法教学中的经典案例,利用素数定义判断正整数n是否为素数,是解决复杂素数问题的基础,该问题涉及循环结构和枚举算法,其代码实现形式多样,可作为入门级算法学习的经典例题,值得深入研究。

原型展示:

自定义函数is_prime(n)的功能是判断正整数n是否为素数,若为素数返回True,否则返回False。请将缺失的代码补充完整。

def is_prime(n):

flag = True

for i in range(2, n):

if 填空1:

flag = False

填空2

题目解析:

根据素数的定义可知,素数不能被1和它本身外的自然数整除,若n能被i整除,说明n不是素数。故第1空答案为n % i == 0。

变量flag用来标记n是否为素数,先假设n为素数,为flag取初值True。若n不是素数,则设置flag=False。函数返回flag的值表示判断结果,故第2空答案为return flag。

拓展思考1:

教师:函数is_prime()使用for循环来遍历n所有可能的因数,以判断其是否为素数。我们知道for语句和while语句都可以实现循环结构功能,那么在本例中又该怎么做呢?

请同学们在函数is_prime()的基础上,用while循环语句代替for循环语句,编写代码实现相同功能。

学生甲:循环结构必须包含3个环节:为循环变量i设置初值、判断循环结束条件和更新循环变量的值。for循环语句比较简明,它把这3个环节都浓缩在一条语句中了,而while循环需要使用3条语句才能实现这3个功能。参考代码如下:

def is_prime2(n):

flag = True

i = 2

while i < n:

if n % i == 0:

flag = False

i += 1

return flag

拓展思考2:

教师:函数is_prime()和is_prime2()都能够实现程序功能,但是效率太低,请同学们思考可以从哪些方面来改进算法,提高程序效率?

改进方案一:

学生甲:当找到n的第一个因数以后,就可以确定n为合数,没必要再枚举其他因数了。所以应该在语句flag=False后面添加语句break,直接跳出循环,可以提高程序效率。参考代码如下:

def is_prime3(n):

flag = True

for i in range(2, n):

if n % i == 0:

flag = False

break

return flag

def is_prime4(n):

flag = True

i = 2

while i < n:

if n % i == 0:

flag = False

break

i += 1

return flag

教师:非常好!充分利用了break语句的特性,直接跳出循环,减少循环次数。还有别的方法吗?

改进方案二:

学生乙:因为n不存在大于n//2的因数,故可以把i的最大值从n-1缩小到n//2,这样就缩小了枚举范围。参考代码如下:

def is_prime5(n): #同理可以对is_prime4()进行改进

flag = True

for i in range(2, n//2+1):

if n % i == 0:

flag = False

break

return flag

学生丙:根据因数成对出现的特性,我们还可以进一步缩小枚举范围,把i的上限设置为n的平方根。参考代码如下:

def is_prime6(n): #同理可以对is_prime4()进行改进

flag = True

for i in range(2, int(n**0.5)+1):

if n % i == 0:

flag = False

break

return flag

拓展思考3:

教师:设置标记变量flag来表示某种状态是常用的编程技巧,在上述程序中变量flag用来标记n是否为素数,最后返回flag的值。那么,变量flag是否是必需的呢?如果不定义flag,能否实现函数功能呢?

自定义函数is_prime7(n)的功能是判断正整数n是否为素数,若为素数返回True,否则返回False。请将缺失的代码补充完整。

def is_prime7(n):

i = 2

while i < n:

if n % i == 0:

break

i += 1

填空1

学生丁:根据代码可知,若n为素数,则程序没有机会执行break语句,while循环结束后,有i==n;否则执行break语句,中途跳出while循环,循环结束后仍然满足i

教师:非常棒!此处虽然没有设置标记变量,但是利用了while循环的特性,根据循环结束后循环条件是否依然成立来判断程序是否执行了break语句,构思非常巧妙。

改进方案三:

学生甲:老师,我还有更好的方法!

教师:是吗?说来听听。

学生甲:函数is_prime7()虽然构思巧妙,但是不过直白,需要转一道弯才能理解。考虑到这是一个自定义函数,我们可以在找到n的第一个因数后直接返回False;只有当n不存在因数时,才返回True。这样代码更简明,参考代码如下:

def is_prime8(n):

for i in range(2, int(n**0.5)+1):

if n % i == 0:

return False

return True

教师:太棒了!既简单明了,又清晰易懂!简直是返璞归真啊!

最后送给大家一道课后思考题:如何使用while循环语句来代替函数is_prime8()中的for循环语句呢?

需要本文word文档、源代码和课后练习答案的,可以加入“Python算法之旅”知识星球参与讨论和下载文件,“Python算法之旅”知识星球汇集了数量众多的同好,更多有趣的话题在这里讨论,更多有用的资料在这里分享。

我们专注Python算法,感兴趣就一起来!

相关优秀文章:

阅读代码和写更好的代码

最有效的学习方式

Python算法之旅文章分类

关键词:

素数判断代码实现及其优化

说在前面素数判断是经典数论问题,也是算法教学中的经典案例,利用素数2023-08-06

四类行业重点企业工伤预防能力提升培训工程将实施

本报北京8月5日电(记者邱玥)近日,人力资源和社会保障部会同国家卫生2023-08-06

村镇建设管理服务中心_村镇建设管理平台登录入口

1、村镇建设管理平台由省住房和城乡建设厅管理、是负责全省建设行政管2023-08-06

朝阳多车被“拉车门”盗,停车注意!

【朝阳万事通传媒发展中心】微信公众号公益分享关注公众号查看今日其他2023-08-05

真的不容易!大连人时隔112天再次在中超赢球

今晚进行的中超第20轮比赛,大连人主场2-1击败申花,时隔112天再次在中2023-08-05

西安百年老油坊的坚守:榨出油 解乡愁

中新网8月5日电题:西安百年老油坊的坚守:榨出油解乡愁  中新网记者2023-08-05

火影忍者563主题曲(火影忍者553主题曲)

1、第553集开始主题曲为:《月の大きさ》-歌:乃木坂462、第527-552集2023-08-05

北京受灾严重地区关键道路加速抢通

北京受灾严重地区关键道路加速抢通---在北京本轮汛情中,北京市管县级2023-08-05

电竞级的极致操作体验!北通携手永劫无间职业联赛

近日,官方正式宣布,北通成为北通正式成为2023永劫无间职业联赛官方手2023-08-05

windows11开机蓝屏怎么办 win11解决了蓝屏

我们操作电脑的时候可能会遇到各种各样的问题,比如有windows11电脑的2023-08-05

《科普》老姑婆有样子看?5大很难有姻缘的女性面相

在相学上女性额头长这样属于剋夫相,就算有姻缘多是不顺利很多坎坷阻碍2023-08-05

咖啡皮色和田籽料黄玉

咖啡的皮色取决于咖啡豆的类型和烘焙程度。最常见的两种咖啡豆是阿拉比2023-08-05

巴萨迷之操作:京多安无法注册,梅西差点被安排,妄想买8000万巨星

对此《世体》表示,巴萨可以用变卖登贝莱和凯西的钱来为球员注册,同时2023-08-05

这个暑假跟着唐诗游柯桥,水乡古韵、美食小吃、运动酷玩一站式拥有

8月4日, "携手亚运畅游柯桥 "2023 "老绍兴·金柯桥 "(上海)文旅推介2023-08-05

特朗普出庭应诉,共和党公布亨特调查证词

新华社北京8月5日电赶在美国共和党籍前总统唐纳德·特朗普3日出庭应诉2023-08-05

王楚然,真是被杨洋坑惨了

王楚然,真是被杨洋坑惨了2023-08-05

威海旅行社哪家口碑好(威海旅行社)

来为大家解答以上问题,威海旅行社哪家口碑好,威海旅行社很多人还不知2023-08-05

人从众!风雨中无言的感动

暴风雨中既有从天而降的英雄,也有开铲车的侠客,彼此携手,不再孤勇。2023-08-05

晚发射、早抵达?探月轨道奥妙多

来源:中国航天报7月14日,印度月船3号探测器成功发射,8月23日有望着2023-08-05

佐助的写轮眼怎么画(佐助的写轮眼)

1、好吧,是我疏忽了,确实是灭门时开的,但我也说了,那不能叫真正的2023-08-05

8月4日基金净值:华夏中证人工智能主题ETF最新净值1.1435,涨2.57%

8月4日,华夏中证人工智能主题ETF最新单位净值为1 1435元,累计净值为12023-08-05

蔚蓝领海(关于蔚蓝领海简述)

,你们好,今天0471房产来聊聊一篇蓝领海,蓝领海简述的文章,网友们对2023-08-05

万宁万城镇积极助力高龄老人补贴认证

“感谢社区的党员照顾我们这些行动不便的老年人,每个月亲自上门替我们2023-08-05

绿叶制药(02186)镇痛药羟考酮纳洛酮缓释片的上市许可申请已获受理

智通财经APP讯,绿叶制药公布,该集团镇痛领域在研产品羟考酮纳洛酮缓2023-08-04

国家外汇管理局公开通报10起涉地下钱庄非法买卖外汇案

新华社北京8月4日电(记者刘开雄)国家外汇管理局4日向社会通报了10起2023-08-04