在 Python 中查找回文素数
Find palindromic primes in Python
回文素数也是回文素数。
比如131是质数,也是回文质数,313和757也是。
我需要编写一个函数来显示前 n
个回文素数。
每行显示10个数字并正确对齐数字,如下:
2 3 5 7 11 101 131 151 181 191
313 353 373 383 727 757 787 797 919 929
我的代码是:
def paliPrime(n):
a=0
b=n
a+=1
for i in range(a,b):
paliPrime=True
if str(i) == str(i)[::-1]:
if i>2:
for a in range(2,i):
if i%a==0:
paliPrime=False
break
if paliPrime:
print i
代码有效,但不是我想要的方式:
>>> paliPrime(10)
3
5
7
>>>
而我想要的是一个显示前n个回文质数的函数。它应该每行显示 10 个数字并正确对齐数字。
使用 indefinite primes generator 并在其上添加一个 itertools 过滤器,只保留回文素数,然后使用 islice(filtered_primes,n)
得到 n
第一个这样的素数:
from itertools import *
def palindPrimes(n):
k = 0
for p in islice( filterfalse( lambda x: str(x) != str(x)[::-1],
postponed_sieve()), n):
## adjust the alignment and print it, then
k += 1
if k == 10:
k = 0
## print a newline to start a new line
WillNess 向您展示了一种非常好的做事方式(接受它)。我会告诉你你做错了什么,这样你就可以从中吸取教训。
由于您不知道前 N 个素数回文的范围,因此您想无限期地迭代并计算您找到的回文数。在简化的伪代码中。
count = 0
number = 2
while count < N
if number is palidromic prime
print number
count += 1
number += 1
通过在代码中添加一些花哨的功能以正确的格式打印数字,您得到
def paliPrime(n):
fmt = '%-5d'
if n >= 1:
print fmt % 2,
count = 2
i = 3
while count <= n:
paliPrime=True
if str(i) == str(i)[::-1]:
for a in range(2,i):
if i%a==0:
paliPrime=False
break
if paliPrime:
print fmt % i,
if count%10 == 0:
print
count += 1
i += 2
# add a newline at the end if we haven't done so already
if count%10 != 1:
print
一些一般性建议是,您应该让每个函数都承担一个责任。在这里,您既生成又打印了数字。想象一下,如果有一天您想要重用代码来生成这些数字,以便它们可以在您的程序中静默使用。你会到处都是指纹。
现在,关于解决方案,您可能已经注意到我调查了从 3 开始并以 2 为增量的数字。那是因为您可以保证除 2 以外的所有偶数都不是素数。
在这里,WillNess 向您展示的内容变得相关了。有更好的算法 generate the next prime or check 一个数字是否是质数而不是暴力强制试除法,顺便说一句,你可以限制最多 sqrt(i)
.
回文素数也是回文素数。 比如131是质数,也是回文质数,313和757也是。
我需要编写一个函数来显示前 n
个回文素数。
每行显示10个数字并正确对齐数字,如下:
2 3 5 7 11 101 131 151 181 191
313 353 373 383 727 757 787 797 919 929
我的代码是:
def paliPrime(n):
a=0
b=n
a+=1
for i in range(a,b):
paliPrime=True
if str(i) == str(i)[::-1]:
if i>2:
for a in range(2,i):
if i%a==0:
paliPrime=False
break
if paliPrime:
print i
代码有效,但不是我想要的方式:
>>> paliPrime(10)
3
5
7
>>>
而我想要的是一个显示前n个回文质数的函数。它应该每行显示 10 个数字并正确对齐数字。
使用 indefinite primes generator 并在其上添加一个 itertools 过滤器,只保留回文素数,然后使用 islice(filtered_primes,n)
得到 n
第一个这样的素数:
from itertools import *
def palindPrimes(n):
k = 0
for p in islice( filterfalse( lambda x: str(x) != str(x)[::-1],
postponed_sieve()), n):
## adjust the alignment and print it, then
k += 1
if k == 10:
k = 0
## print a newline to start a new line
WillNess 向您展示了一种非常好的做事方式(接受它)。我会告诉你你做错了什么,这样你就可以从中吸取教训。
由于您不知道前 N 个素数回文的范围,因此您想无限期地迭代并计算您找到的回文数。在简化的伪代码中。
count = 0
number = 2
while count < N
if number is palidromic prime
print number
count += 1
number += 1
通过在代码中添加一些花哨的功能以正确的格式打印数字,您得到
def paliPrime(n):
fmt = '%-5d'
if n >= 1:
print fmt % 2,
count = 2
i = 3
while count <= n:
paliPrime=True
if str(i) == str(i)[::-1]:
for a in range(2,i):
if i%a==0:
paliPrime=False
break
if paliPrime:
print fmt % i,
if count%10 == 0:
print
count += 1
i += 2
# add a newline at the end if we haven't done so already
if count%10 != 1:
print
一些一般性建议是,您应该让每个函数都承担一个责任。在这里,您既生成又打印了数字。想象一下,如果有一天您想要重用代码来生成这些数字,以便它们可以在您的程序中静默使用。你会到处都是指纹。
现在,关于解决方案,您可能已经注意到我调查了从 3 开始并以 2 为增量的数字。那是因为您可以保证除 2 以外的所有偶数都不是素数。
在这里,WillNess 向您展示的内容变得相关了。有更好的算法 generate the next prime or check 一个数字是否是质数而不是暴力强制试除法,顺便说一句,你可以限制最多 sqrt(i)
.