在Python中查找回文素数

时间:2016-01-18 10:58:48

标签: python function loops primes palindrome

回文素数是一个也是回文的素数。 例如,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个数字并正确对齐数字。

2 个答案:

答案 0 :(得分:1)

使用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

答案 1 :(得分:1)

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下一个素数或check有一个更好的算法,无论数字是素数而不是强制试验除法,顺便说一下,你可以限制为sqrt(i)。< / p>