侯体宗的博客
  • 首页
  • Hyperf版
  • beego仿版
  • 人生(杂谈)
  • 技术
  • 关于我
  • 更多分类
    • 文件下载
    • 文字修仙
    • 中国象棋ai
    • 群聊
    • 九宫格抽奖
    • 拼图
    • 消消乐
    • 相册

解决Python中回文数和质数的问题

Python  /  管理员 发布于 7年前   221

一、前言

今天学习视频时课后作业是找出1000以内既是素数又是回文数的数,写代码这个很容易,结果一运行遇到了bug,输出结果跟预期不一样,调试了快30min,再接着一通搜索和回看视频才发现问题所在。所以特地写下来,方便以后查看。问题的关键是判断素数过程中for…else的用法上(具体看后面代码)

二、实现判断素数的功能

质数(Prime number),又称素数,指在大于1的自然数中,除了1和该数自身外,无法被其他自然数整除的数(也可定义为只有1与该数本身两个因数的数)。via――Wikipedia

所以采用穷举法只要在2~n-1的区间,没有一个数能整除n,那么n就是素数。

对2-n-1区间进行合理优化,假设x*y=n(x<=y),那么当x和y相等时,x有最大值。即x=y=sqrt(n),所以x的区间就可以限制为2~sqrt(n)+1。还有疑问,可以在再多想想,纸上算一算。

因为这里要用到sqrt()方法,所以需要导入math模块。

不多说,直接上代码:

# 求解1000以内的所有素数,正确版本import mathnum = 2count = 0list_s = []max_d = 1000while num < max_d: length = int(math.sqrt(num)+1) # 对遍历范围进行合理优化 for i in range(2,length): # 注意从2开始  if num % i == 0:   break else: # 这里的else跟for对齐,而不是跟if,表示只有for顺利执行时,else才执行  count += 1  list_s.append(num) # 存入列表 num += 1if count == 0: print(max_d,'以内没有素数')else: print(max_d,'以内的素数有',count,'个,分别是:',list_s)

输出结果:

这个代码完全没有问题,然后下面给出一个有问题的代码:

# 求解40以内的所有素数,错误版本import mathnum = 2count = 0list_s = []max_d = 40while num < max_d: length = int(math.sqrt(num)+1) # 对遍历范围进行合理优化 for i in range(2,length): # 注意从2开始  if num % i == 0:   break  else: # 这里的else跟if对齐,会导致一个素数会被写入int(math.sqrt(num))-1次,同时一些非素数也会被当做素数   count += 1   list_s.append(num) # 存入列表 num += 1if count == 0: print(max_d,'以内没有素数')else: print(max_d,'以内的素数有',count,'个,分别是:',list_s)

输出结果:

所以,一定要认真对待循环中else对齐问题。这个在解决素数问题中很重要。小结一下while…else和for…else

只有循环完所有次数,才会执行 else ,循环体中有continue存在,也不影响else执行。

一旦循环体中触发了break ,就会阻止 else 语句块的执行。

三、实现判断回文数的功能

回文数即从左到右和从右到左一样。如:12321。

方法:

把已知的num1数反过来,得到num2,如123变为321,采用//10 %10 *10等运算操作,其中还要借助一个临时变量tmp

判断如果num1 == num 2,则num1是回文数,反之不是

代码如下:

# 求解1000以内的所有回文数num = 0 # 这里num从0开始list_h = []max_d = 10000count = 0 while num < max_d: tmp = num num_p = 0 while tmp != 0:  num_p = num_p*10 + tmp % 10  tmp //= 10 if num_p == num:  list_h.append(num)  count += 1 num += 1  if count == 0: print(max_d,'以内没有回文数')else: print(max_d,'以内的回文数有',count,'个,分别是:',list_h)

更新:对于判断回文数或者回文字符串,采用双端队列的数据结构,会非常简单。实现如下:

from collections import dequedef palindrome(word): dq = deque(word) while len(dq) > 1:  if dq.pop() != dq.popleft():   return False return Trueif __name__ == '__main__': max_num = 10000 for i in range(max_num):  s = str(i)  if palindrome(s):   print(i, end=',')

四、实现同时判断回文数和质数

需要选择是否嵌套以及先判断回文还是先判断素数,所以又四个版本。大家可以自己思考每个版本的性能上有无区别,占用空间有无区别。因为我也没有太想明白,所以没有放上来。

我写了四个版本,都能实现需求。不过从性能上,在我测试的100-1000000区间,采用嵌套的先求解回文再判断素数要快一些。

不多说,四个版本的代码全部在写下面,可以自行删掉相应的'''标记进行测试。

'''# 版本一、求1000以内的回文素数,多层嵌套,先求素数后回文数import mathnum = 2count = 0list_s = []list_sh = []max_d = 1000while num < max_d: length = int(math.sqrt(num)+1) for i in range(2,length):  if num % i == 0:   break else:  list_s.append(num)  tmp = num  num_p = 0  while tmp != 0:   num_p = num_p * 10 + tmp % 10   tmp //= 10  if num == num_p:   list_sh.append(num)   count +=1 num += 1print(max_d,'以内的素数有:',list_s)if count == 0: print(max_d,'以内没有既是素数又是回文数的数')else: print(max_d,'以内既是素数又是回文数的数有',count,'个,分别是:',list_sh)''''''# 版本二、求1000以内的回文素数,多层嵌套,先求回文数后求素数import mathnum = 2count = 0list_h = []list_hs = []max_d = 1000while num < max_d: tmp = num num_p = 0 while tmp != 0:  num_p = num_p * 10 + tmp % 10  tmp //= 10 if num == num_p:  list_h.append(num)  length = int(math.sqrt(num)+1)  for i in range(2,length):   if num % i == 0:    break  else:   list_hs.append(num)   count +=1 num += 1print(max_d,'以内的素数有:',list_h)if count == 0: print(max_d,'以内没有既是素数又是回文数的数')else: print(max_d,'以内既是素数又是回文数的数有',count,'个,分别是:',list_hs)''''''# 版本三、求1000以内的回文素数,先求素数再求回文数import mathnum = 2list_s = []max_d = 1000while num < max_d: length = int(math.sqrt(num)+1) for i in range(2,length):  if num % i == 0:   break else: # 注意这里的else是和for对齐  list_s.append(num) num += 1count = 0list_sh = []for i in list_s: tmp = i num_p = 0 while tmp != 0:  num_p = num_p*10 + tmp % 10  tmp //= 10 if num_p == i:  list_sh.append(i)  count += 1  print(max_d,'以内的素数有:',list_s)if count == 0: print(max_d,'以内没有既是素数又是回文数的数')else: print(max_d,'以内既是素数又是回文数的数有',count,'个,分别是:',list_sh)''''''# 版本四、求1000以内的回文素数,先求回文数,再求素数import mathnum = 2list_h = []max_d = 10000while num < max_d: tmp = num num_p = 0 while tmp != 0:  num_p = num_p*10 + tmp % 10  tmp //= 10 if num_p == num:  list_h.append(num) num += 1count = 0list_sh = []for hn in list_h: length = int(math.sqrt(hn)+1) for i in range(2,length):  if hn % i == 0:   break else: # 注意这里的else是和for对齐  list_sh.append(hn)  count += 1  print(max_d,'以内的回文数有:',list_h)if count == 0: print(max_d,'以内没有既是素数又是回文数的数')else: print(max_d,'以内既是素数又是回文数的数有',count,'个,分别是:',list_sh)'''

五、总结

这个过程帮助自己更加深刻的理解了if…elif…else 、for…else和while…else以后使用时会更加注意。

以上这篇解决Python中回文数和质数的问题就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持。


  • 上一条:
    python求质数列表的例子
    下一条:
    使用python实现回文数的四种方法小结
  • 昵称:

    邮箱:

    0条评论 (评论内容有缓存机制,请悉知!)
    最新最热
    • 分类目录
    • 人生(杂谈)
    • 技术
    • linux
    • Java
    • php
    • 框架(架构)
    • 前端
    • ThinkPHP
    • 数据库
    • 微信(小程序)
    • Laravel
    • Redis
    • Docker
    • Go
    • swoole
    • Windows
    • Python
    • 苹果(mac/ios)
    • 相关文章
    • 在python语言中Flask框架的学习及简单功能示例(0个评论)
    • 在Python语言中实现GUI全屏倒计时代码示例(0个评论)
    • Python + zipfile库实现zip文件解压自动化脚本示例(0个评论)
    • python爬虫BeautifulSoup快速抓取网站图片(1个评论)
    • vscode 配置 python3开发环境的方法(0个评论)
    • 近期文章
    • 智能合约Solidity学习CryptoZombie第三课:组建僵尸军队(高级Solidity理论)(0个评论)
    • 智能合约Solidity学习CryptoZombie第二课:让你的僵尸猎食(0个评论)
    • 智能合约Solidity学习CryptoZombie第一课:生成一只你的僵尸(0个评论)
    • 在go中实现一个常用的先进先出的缓存淘汰算法示例代码(0个评论)
    • 在go+gin中使用"github.com/skip2/go-qrcode"实现url转二维码功能(0个评论)
    • 在go语言中使用api.geonames.org接口实现根据国际邮政编码获取地址信息功能(1个评论)
    • 在go语言中使用github.com/signintech/gopdf实现生成pdf分页文件功能(0个评论)
    • gmail发邮件报错:534 5.7.9 Application-specific password required...解决方案(0个评论)
    • 欧盟关于强迫劳动的规定的官方举报渠道及官方举报网站(0个评论)
    • 在go语言中使用github.com/signintech/gopdf实现生成pdf文件功能(0个评论)
    • 近期评论
    • 122 在

      学历:一种延缓就业设计,生活需求下的权衡之选中评论 工作几年后,报名考研了,到现在还没认真学习备考,迷茫中。作为一名北漂互联网打工人..
    • 123 在

      Clash for Windows作者删库跑路了,github已404中评论 按理说只要你在国内,所有的流量进出都在监控范围内,不管你怎么隐藏也没用,想搞你分..
    • 原梓番博客 在

      在Laravel框架中使用模型Model分表最简单的方法中评论 好久好久都没看友情链接申请了,今天刚看,已经添加。..
    • 博主 在

      佛跳墙vpn软件不会用?上不了网?佛跳墙vpn常见问题以及解决办法中评论 @1111老铁这个不行了,可以看看近期评论的其他文章..
    • 1111 在

      佛跳墙vpn软件不会用?上不了网?佛跳墙vpn常见问题以及解决办法中评论 网站不能打开,博主百忙中能否发个APP下载链接,佛跳墙或极光..
    • 2016-10
    • 2016-11
    • 2018-04
    • 2020-03
    • 2020-04
    • 2020-05
    • 2020-06
    • 2022-01
    • 2023-07
    • 2023-10
    Top

    Copyright·© 2019 侯体宗版权所有· 粤ICP备20027696号 PHP交流群

    侯体宗的博客