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


Posted in Python onNovember 24, 2019

一、前言

今天学习视频时课后作业是找出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 math

num = 2
count = 0
list_s = []
max_d = 1000
while 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 += 1
if count == 0:
 print(max_d,'以内没有素数')
else:
 print(max_d,'以内的素数有',count,'个,分别是:',list_s)

输出结果:

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

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

# 求解40以内的所有素数,错误版本
import math

num = 2
count = 0
list_s = []
max_d = 40
while 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 += 1
if count == 0:
 print(max_d,'以内没有素数')
else:
 print(max_d,'以内的素数有',count,'个,分别是:',list_s)

输出结果:

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

所以,一定要认真对待循环中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 = 10000
count = 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 deque

def palindrome(word):
 dq = deque(word)
 while len(dq) > 1:
  if dq.pop() != dq.popleft():
   return False
 return True

if __name__ == '__main__':
 max_num = 10000
 for i in range(max_num):
  s = str(i)
  if palindrome(s):
   print(i, end=',')

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

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

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

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

'''
# 版本一、求1000以内的回文素数,多层嵌套,先求素数后回文数

import math

num = 2
count = 0
list_s = []
list_sh = []
max_d = 1000
while 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 += 1
print(max_d,'以内的素数有:',list_s)
if count == 0:
 print(max_d,'以内没有既是素数又是回文数的数')
else:
 print(max_d,'以内既是素数又是回文数的数有',count,'个,分别是:',list_sh)

'''


'''
# 版本二、求1000以内的回文素数,多层嵌套,先求回文数后求素数

import math

num = 2
count = 0
list_h = []
list_hs = []
max_d = 1000
while 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 += 1
print(max_d,'以内的素数有:',list_h)
if count == 0:
 print(max_d,'以内没有既是素数又是回文数的数')
else:
 print(max_d,'以内既是素数又是回文数的数有',count,'个,分别是:',list_hs)
'''


'''
# 版本三、求1000以内的回文素数,先求素数再求回文数

import math

num = 2
list_s = []
max_d = 1000

while 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 += 1


count = 0
list_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 math

num = 2
list_h = []
max_d = 10000

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)
 num += 1


count = 0
list_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 基础教程之闭包的使用方法
Sep 29 Python
TensorFlow实现创建分类器
Feb 06 Python
python实现基于信息增益的决策树归纳
Dec 18 Python
python使用Plotly绘图工具绘制气泡图
Apr 01 Python
python+selenium实现简历自动刷新的示例代码
May 20 Python
10 行Python 代码实现 AI 目标检测技术【推荐】
Jun 14 Python
一行python实现树形结构的方法
Aug 09 Python
解决Python计算矩阵乘向量,矩阵乘实数的一些小错误
Aug 26 Python
解析python 类方法、对象方法、静态方法
Aug 15 Python
Python批量删除mysql中千万级大量数据的脚本分享
Dec 03 Python
使用python操作lmdb对数据读取的实例
Dec 11 Python
python自动化办公操作PPT的实现
Feb 05 Python
使用python实现回文数的四种方法小结
Nov 24 #Python
python代码打印100-999之间的回文数示例
Nov 24 #Python
Django 自定义分页器的实现代码
Nov 24 #Python
基于python的列表list和集合set操作
Nov 24 #Python
使用Pyhton集合set()实现成果查漏的例子
Nov 24 #Python
Python完全识别验证码自动登录实例详解
Nov 24 #Python
关于Python 常用获取元素 Driver 总结
Nov 24 #Python
You might like
PHP设计模式之解释器模式的深入解析
2013/06/13 PHP
PHP里的单例类写法实例
2015/06/25 PHP
ThinkPHP连接Oracle数据库
2016/04/22 PHP
thinkphp自定义权限管理之名称判断方法
2017/04/01 PHP
yii框架数据库关联查询操作示例
2019/10/14 PHP
dojo 之基础篇
2007/03/24 Javascript
使用jQuery简化Ajax开发 Ajax开发入门
2009/10/14 Javascript
jquery隐藏标签和显示标签的实例
2013/11/11 Javascript
Mac OS X 系统下安装和部署Egret引擎开发环境
2014/09/03 Javascript
浅谈Unicode与JavaScript的发展史
2015/01/19 Javascript
深入理解JavaScript系列(22):S.O.L.I.D五大原则之依赖倒置原则DIP详解
2015/03/05 Javascript
javascript使用shift+click实现选择和反选checkbox的方法
2015/05/04 Javascript
jquery中取消和绑定hover事件的实现代码
2016/06/02 Javascript
javascript运算符语法全面概述
2016/07/14 Javascript
Vim快速合并行及vim 将文件所有行合并到一行
2017/11/27 Javascript
vue中根据时间戳判断对应的时间(今天 昨天 前天)
2019/12/20 Javascript
Vue 中获取当前时间并实时刷新的实现代码
2020/05/12 Javascript
删除目录下相同文件的python代码(逐级优化)
2012/05/25 Python
Linux下用Python脚本监控目录变化代码分享
2015/05/21 Python
python append、extend与insert的区别
2016/10/13 Python
解决Python的str强转int时遇到的问题
2018/04/09 Python
Python 读取指定文件夹下的所有图像方法
2018/04/27 Python
快速解决vue.js 模板和jinja 模板冲突的问题
2019/07/26 Python
pytorch  网络参数 weight bias 初始化详解
2020/06/24 Python
关于Python不换行输出和不换行输出end=““不显示的问题(亲测已解决)
2020/10/27 Python
python如何用matplotlib创建三维图表
2021/01/26 Python
Kathmandu美国网站:新西兰户外运动品牌
2019/03/23 全球购物
介绍一下ICMP(Internet Control Message Protocol)Internet控制信息协议
2016/11/26 面试题
酒店公关部经理岗位职责
2013/11/24 职场文书
运动会通讯稿400字
2014/01/28 职场文书
会计系毕业生求职信
2014/05/28 职场文书
机械设计专业大学生职业生涯规划书范文
2014/09/13 职场文书
自愿离婚协议书范本
2014/09/13 职场文书
高中课前三分钟演讲稿
2014/09/13 职场文书
关于九一八事变的演讲稿2014
2014/09/17 职场文书
关于Spring配置文件加载方式变化引发的异常详解
2022/01/18 Java/Android