python练习:可逆素数

金鞍少年的刷题之路 专栏收录该内容
37 篇文章 4 订阅

题目:可逆素数

问题描述:

编写程序找出1 ~ 900之间的所有可逆素数(可逆素数是指一个素数的各位数值顺序颠倒后得到的数仍为素数,如113、311)。

解题思路

1、找到1-900之间所有素数并储存到一个表里面
2、迭代所有的数,是素数的话将素数转化成字符串,通过逆转操作,得到反序数
3、判断反序数是否是素数,如果是则打印出两个数

#通过筛法求素数
在这里插入图片描述
从2开始依次往后面数,如果当前数字一个素数,那么就将所有其倍数的数从表中删除或者标记,然后最终得到所有的素数。

筛法求素数有一个速度性能上的优化 1、先标记2,那么2的倍数都不是素数,依次 ,2,4,6,8,10,12都会被标记
2、标记3,应该是从9开始,而不是6,并且以3的倍数为间隔,来进行标记,这样减少大量运算时间
3、除了2以外,所有素数都是奇数。奇数的平方还是奇数,如果再加上奇数就变成了偶数一定不会是素数,所以加偶数(2倍素数)。
预先处理了所有偶数。

#筛法得到一个标记为素数的表
n=int(input('请输入查找范围:'))
def primeNumber(n):
    pt=[True]*n
    s=[]
    for p in range(2,n):
        if not pt[p]:
            continue
        for i in range(p*p,n,p):
            pt[i]=False
    return pt
pt=primeNumber(n)

for p in range(10,n):
    if not pt[p]:
        continue #如果pt[p]为False,则跳过
    q=int(str(p)[::-1])#得到反序数
    if pt[q]:
        print(q,p)
    
    #13 31 和31 13会重复打印2遍,通过下方代码筛选打印
    #n为200是,119的反序数为911,超出列表范围,则q<n
    if pt[q] and q!=p and q<n:
    	pt[q]=False# 如pt[p]已经打印了,则将它的相反数标记为false,避免重复打印
    	print(p,q)
  • 1
    点赞
  • 0
    评论
  • 9
    收藏
  • 打赏
    打赏
  • 扫一扫,分享海报

©️2022 CSDN 皮肤主题:岁月 设计师:pinMode 返回首页

打赏作者

金鞍少年

你的鼓励将是我创作的最大动力

¥2 ¥4 ¥6 ¥10 ¥20
输入1-500的整数
余额支付 (余额:-- )
扫码支付
扫码支付:¥2
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、C币套餐、付费专栏及课程。

余额充值