素数判断代码实现及其优化
说在前面
素数判断是经典数论问题,也是算法教学中的经典案例,利用素数定义判断正整数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算法之旅文章分类 标签:
您可能也感兴趣:
为您推荐
军队抽组医疗力量承担 武汉火神山医院医疗救治任务
同马来西亚总理马哈蒂尔通电话 创造更多合作成果,造福两国和两国人民。
构筑起疫情防控的严密防线
排行
- 长沙楼市真相:限利润还是保地价
- 华翔股份拟投资10亿元建华翔(洪洞)智能科技产业园项目 进一...
- 好想你出售百草味后营收净利润断崖式下滑 毛利率连续三年下降
- 上海发布《关于进一步减轻义务教育阶段学生作业负担和校外培...
- 兴业证券拟配股公开发行证券募集不超过140亿元 补充营运资金
- 元成股份2021年上半年营业收入2.76亿元 同比减少15.07%
- 爱丽家居2021年上半年归母净利润约为780.31万元 同比减少82.31%
- 翠微股份上半年营业收入17.38亿元 同比下降7.98%
- 康泰医学上市一周年遭股东抛售 二季度净利跌逾70%
- 新开普2021年上半年净利润为607.25万元 同比减少80%
精彩推送
- 素数判断代码实现及其优化
- 32.3%!深汕上半年成绩单出炉!
- 压不弯的民族脊梁 冲不垮的精神堤坝
- 深圳北理莫斯科大学747名2023级本科新生报到
- [视频]江苏培育经济新增长极 推动高质量发展
- 【聚焦新疆高质量发展】67.22亿元!上半年哈密市消费市场持续向好
- 《长相思》王姬回归仪式,小夭后宫到齐,4男主表情差异一目了然
- 乱象频出,还有必要报名研学团吗?教育专家:关键是重“质”...
- 领导不喜欢下属时,常用的六个套路,看懂才不会掉坑里
- 最牛地级市,干翻了两个直辖市
- 冯振英雄,一路走好!云南永远记得你的笑容
- 顺丰捐赠1000万元支援京津冀等受灾地区
- 消防安全“零距离”——桃源街道长青老龄大学开展消防安全教...
- 润曦府生活美学示范区开放
- 一大批学校9月集中“上新”!深圳今年新建和改扩建182所中小...
- 在校女大学生应征入伍条件(在校女大学生当兵条件)
- 乘联会崔东树:1-6月中国占世界新能源车份额60%
- 《一人之下3》开播两小时播放量破8千万!这段剧情为何会遭删减?
- 评论 | 推动经济运行好转重在扩大国内需求
- 夏季洪水退后当心霉菌过敏性哮喘发病,专家详解如何预防
- 香港经济增长步伐放缓:PMI首次跌破50分界线,GDP增长仅1.5%
- 定了!汕头将再次举办国家级大会!
- 香港经济增长预期遭多家机构下调
- GDP增速仅次浦东,这是最让人想不到的黑马之区!
- 从前两次牛市看这次的可能性
- 亚运会女足赛程:中国女足9月22日首战蒙古,小组赛均19:30开球
- CPI将转负!不过,经济将迎来五方面向好信号
- 2023年内蒙古阿拉善盟飞播造林逾20万亩
- 梅溪湖街道华茂社区:为快递小哥撑起“遮阳伞”
- 多措并举 成都加快建设国际消费中心城市
- 安徽2023上半年经济“成绩单”出炉,宿州今年排名。。。
- 余鸿兴:民营企业要高质量发展,产品和服务永远是关键!
- 俗话说“门前放3物,财神进家门”是放哪三物?为何这么讲究?
- 2021.11周 | 复盘中也要时常出现点新鲜事
- 新疆上半年外送电量600多亿千瓦时 新能源占比超三成
- 波士顿咨询公司发布《银行业生成式AI应用报告(2023)》
- 证券行业定向“降准” 预计将释放超300亿元资金
- 郑州率先官宣“认房不认贷”,楼市有何新变化?
- 国风音乐在线听 国风音乐
- 2023年上半年河北各市GDP排行榜 廊坊增速最快 邢台最慢
- 金羊网评:中国高水平对外开放激活世界经济一池春水
- 独家专访卢森堡证交所总裁:正在探索加入中欧通|直通全球交易所
- 腾讯着了游戏的道
- 漂在大城市的90后:三十难立
- 构建“大普法”格局 推动法治成果共享 吴江区全力建设具有...
- 各省GDP倒数第一名
- 省会城市“卡位战”:三城增速超9%,合肥险胜济南,“抢六”...
- α难续,苹果也“跪”了
- 政策效果显现 有力推动经济向好 基本情况讲解
- 河北献县泛区转移群众安置工作有序进行
- 各省GDP增速:上海、海南领跑,江西、广西垫底
- 北安2吨低温磁化降解炉会在农村垃圾处理中的应用
- 九鹏基地发生爆炸,台军“神秘”火箭导弹试验机构引发关注
- 洪灾下的涿州:书商损失过亿,网友涌进直播间“救书”
- 湖南省新田县发布高温橙色预警
- 暑期工用工乱象调查:分拣装卸快递一周仅到手100多
- 瑞幸又杀回来了
- 《封神》破14亿,北京文化想翻身
- 9块9的AI芭比写真,治好了我的“完美焦虑症”
- 俄军在波罗的海举行演习 重点部署新式杀手锏武器装备
- 7月中国大宗商品指数为102.3%
- 娄底发展动能持续增强
- 中央确定南京为全国性中心城市,徐州苏州连云港等5大总部迁省会
- 财联社创投通:一级市场本周109起融资环比增14.7% 滴灌通完...
- 上半年,全省实际利用内资和外资同比分别增长23.5%和85.2% ...
- 稳预期 增信心 保持经济回升向好
- 【榜上诗家】张兴瑜||中国雪乡林城的早晨(组诗)
- tbc诺格弗格药剂任务流程 诺格弗格药剂任务流程
- 如何保持经济稳定向好?这套“组合拳”看明白
- 8月4日基金净值:招商瑞利灵活配置混合(LOF)A最新净值2.4269,涨0.68%
- 贵阳优质资产招商推介会在深圳举行
- 潜能恒信08月04日被深股通减持21.41万股
- 到2060年,我国到底会剩下多少人口?专家说出答案
- 同花顺08月04日获深股通增持41.28万股
- 80岁老人因喝未煮沸山泉水被送入ICU抢救
- 调整产业结构 发力薄弱环节 辽宁工业经济企稳向好
- 国乒名将又输日本选手!曾5连胜伊藤美诚,如今大运会却2次掉链子
- 有心者胜·新经济篇 | 观点与顾伟对话:数字化的本质
- 打好“组合拳” 推动经济持续回升向好(锐财经)
- 自贸试验区成为外贸发展重要承载平台
- 多维发力提高 A 股交易活跃度
- 为经济持续恢复向好创造稳定政策环境
- 打好“组合拳” 推动经济持续回升向好(锐财经)
- 全国股转公司推出公示审核和绿色通道机制
- 人民币对土耳其里拉汇率是多少?8月4日土耳其里拉汇率实时查询
- 人民币对瑞典克朗汇率今日 8月4日瑞典克朗汇率查询
- 人民币对匈牙利福林汇率今日 8月4日匈牙利福林汇率查询
- 人民币对韩元汇率换算今日价格 8月4日韩元汇率实时查询
- 人民币对泰铢今日汇率多少?8月4日泰铢汇率实时查询
- 纸浆巨头Suzano和私募公司考虑竞购维达国际股份
- 小儿难养电视剧35集(小儿难养电视剧全集在哪看啊 急求)
- 主页被改为360_主页被360篡改怎么办
- 月宫好不好玩(月宫palacemoon贴图)
- 小米手机一直重启就是开不开机 我的小米手机开不了机了 一...
- 6月末四川省各项贷款突破10万亿元,增速连续11个月居全国前三
- 官宣!北京第一梯队!
- 首位度接近30%,这个西北省会还不够强?
- 上半年广东各市GDP完整排名!
- 在河北涿州,有一种力量叫“八方支援”
- 人和环境股东朱圣杰增持33.01万股 权益变动后直接持股比例为13.32%