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

  • 1. 前言
  • 2. 实现判断素数的功能
  • 3. 实现判断回文数的功能
  • 4. 实现同时判断回文数和质数
  • 5. 总结

1. 前言

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

2. 实现判断素数的功能

质数(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 = 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:breakelse: # 这里的else跟for对齐,而不是跟if,表示只有for顺利执行时,else才执行count += 1list_s.append(num) # 存入列表num += 1
if count == 0:print(max_d,'以内没有素数')
else:print(max_d,'以内的素数有',count,'个,分别是:',list_s)

输出结果:

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

# 求解40以内的所有素数,错误版本
import mathnum = 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:breakelse: # 这里的else跟if对齐,会导致一个素数会被写入int(math.sqrt(num))-1次,同时一些非素数也会被当做素数count += 1list_s.append(num) # 存入列表num += 1
if count == 0:print(max_d,'以内没有素数')
else:print(max_d,'以内的素数有',count,'个,分别是:',list_s)

输出结果:

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

  1. 只有循环完所有次数,才会执行 else ,循环体中有continue存在,也不影响else执行。
  2. 一旦循环体中触发了break ,就会阻止 else 语句块的执行。

3. 实现判断回文数的功能

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

  1. 把已知的num1数反过来,得到num2,如123变为321,采用//10 %10 *10等运算操作,其中还要借助一个临时变量tmp
  2. 判断如果num1 == num 2,则num1是回文数,反之不是
    代码如下:
# 求解1000以内的所有回文数
num = 0 # 这里num从0开始
list_h = []
max_d = 10000
count = 0 while num < max_d:tmp = numnum_p = 0while tmp != 0:num_p = num_p*10 + tmp % 10tmp //= 10if num_p == num:list_h.append(num)count += 1num += 1if 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 Falsereturn Trueif __name__ == '__main__':max_num = 10000for i in range(max_num):s = str(i)if palindrome(s):print(i, end=',')

4. 实现同时判断回文数和质数

需要选择是否嵌套以及先判断回文还是先判断素数,所以又四个版本。大家可以自己思考每个版本的性能上有无区别,占用空间有无区别。因为我也没有太想明白,所以没有放上来。
我写了四个版本,都能实现需求。不过从性能上,在我测试的100-1000000区间,采用嵌套的先求解回文再判断素数要快一些。
不多说,四个版本的代码全部在写下面,可以自行删掉相应的’’'标记进行测试。

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

5. 总结

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

后记:
我从本硕药学零基础转行计算机,自学路上,走过很多弯路,也庆幸自己喜欢记笔记,把知识点进行总结,帮助自己成功实现转行。
2020下半年进入职场,深感自己的不足,所以2021年给自己定了个计划,每日学一技,日积月累,厚积薄发。
如果你想和我一起交流学习,欢迎大家关注我的微信公众号每日学一技,扫描下方二维码或者搜索每日学一技关注。
这个公众号主要是分享和记录自己每日的技术学习,不定期整理子类分享,主要涉及 C – > Python – > Java,计算机基础知识,机器学习,职场技能等,简单说就是一句话,成长的见证!

Python中回文数和质数问题的解决相关推荐

  1. python判断回文数字,Python判断回文数的三种方法实例

    需求: 从控制台输入一个五位数,如果是回文数就打印"是回文数",否则打印"不是回文数",例如:11111 12321 12221 "回文"是 ...

  2. python判断回文数_Python练习题---判断回文数

    设n是一个任意自然数,如果n的各位数字反向排序所得的自然数与n相等,则n被称为回文数,从键盘输入一个5位数字 ,请编写程序判断这个数字是不是回文数. 思路:先获取一个字符串,再判断该字符串是否满足是自 ...

  3. python判断回文_用python判断回文数

    信息举报 时间:2020-11-23 本页为您甄选多篇描写用python判断回文数,用python判断回文数精选,用python判断回文数大全,有议论,叙事 ,想象等形式.文章字数有400字.600字 ...

  4. python计算回文数的方法_Python计算回文数的方法

    本文实例讲述了Python计算回文数的方法.分享给大家供大家参考.具体如下: 这里检查数字是不是回文数,用196算法生成一个数字的回文数 num = 905; def is_Palindrome(nu ...

  5. python判断回文数_python如何判断是不是回文数

    什么是回文数: 有这样一类数,他们顺着看和倒着看是相同的数,例如:12321,1221,2332等,这样的数字就称为:回文数. 例子:输入一个5位数,判断它是不是回文数.即12321是回文数,个位与万 ...

  6. 求中位数中回文数之和C语言,一些算法题及答案

    1. 两数之和 给定一个整数数组 nums 和一个目标值 target,请你在该数组中找出和为目标值的那 两个 整数,并返回他们的数组下标. 你可以假设每种输入只会对应一个答案.但是,你不能重复利用这 ...

  7. python判断回文数_Python实现判断一个整数是否为回文数算法示例

    本文实例讲述了Python实现判断一个整数是否为回文数算法.分享给大家供大家参考,具体如下: 第一个思路是先将整数转换为字符串,再将字符串翻转并与原字符串做比较 def isPalindrome(se ...

  8. 既是回文数又是质数c语言,素数回文——输出两整数之间所有既是回文数又是素数的数 C++实现...

    问题分析与算法设计 所谓回文素数是指,对一个整数n从左向右和从由向左读其结果值相同且是素数,即称n为回文素数.所以本题的重点不是判断素数的方法,而是求回文整数.构造回文数的方法很多,这里仅介绍一种最简 ...

  9. 五位回文数质数c语言程序,(1)求既是回文数又是质数的五位十进制数。

    判断质数函数 //判断是否是素数 bool_isPrime(int num) { int i; int temp = sqrt(num); for(i=2;i if(num % i==0) retur ...

最新文章

  1. AI独角兽面对BAT,挑战还是臣服?| 《财经》封面
  2. Drupal 7.31 SQL注射分析POC
  3. mysql 数据文件压缩,压缩MySQL数据文件的妙招
  4. 事务控制语句,begin,rollback,savepoint,隐式提交的SQL语句
  5. Matlab回显语句
  6. Java FileDescriptor sync()方法与示例
  7. OJ1029: 三角形判定
  8. 美团面经-java开发
  9. 解决vue2+vue-cli3项目ie兼容问题
  10. const char *p;和char * const p的区别
  11. 设计模式-01-设计模式简介及分类
  12. 思考的乐趣----matrix67数学笔记:最精妙的无字证明
  13. 情侣推送早安问候之小程序订阅通知模板推送 (出现在消息列表的服务通知)
  14. python 拆分excel单元格_python使用openpyxl excel 合并拆分单元格
  15. 牛客刷题系列(C++)——详解MGJ8 链表合并(目前内存开销最小)
  16. android手机如何截屏,安卓手机怎么截图? (全文)
  17. Apache-WebLogic plub-in插件的安装
  18. StarUml----逆向工程操作步骤
  19. 基于SSM的婚纱影楼系统
  20. 怎样抠图去背景?教你快速抠图的方法

热门文章

  1. 王者荣耀转系统服务器繁忙,换手机党的福音,王者荣耀开启跨系统角色转移,但这些问题要注意...
  2. 笔记本电脑硬盘不见了_笔记本电脑找不到硬盘原因及解决方法
  3. 设置input框只能输入数字或者只能输入英文
  4. 最佳平方逼近 matlab,最佳平方逼近的Matlab
  5. 图解网络:组建一个网络需要用到哪些硬件设备?
  6. windows下安装mpich2
  7. k8s中使用基于nfs的storageclass
  8. 1.华为分布式存储fusionstorage介绍
  9. gif制作软件哪个好用?建议收藏这些软件
  10. 实战day01(二)----电商行业的背景介绍