【问题标题】:Find palindromic primes in Python在 Python 中查找回文素数
【发布时间】:2016-01-18 10:58:48
【问题描述】:

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

【问题讨论】:

  • 您是否考虑过您的代码在做什么以及为什么它没有产生您想要的输出?如果b 是您的输入,您认为for I in range(a,b) 在做什么?
  • @Lucia 您的代码可以很好地查找回文素数。您的问题是您没有检查在任何阶段都找到了多少回文素数。也许这是一个不错的起点?
  • 使用indefinite primes generator 并在其上添加一个itertools 过滤器,只保留回文素数,然后使用islice(filtered_primes,n) 获得n 第一个这样的素数。
  • @WillNess 你应该把它写成答案。
  • 我很想得到你们中的一个人@Reti43 的回答,或者 WillNess 好的因果报应:)

标签: python function loops primes palindrome


【解决方案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)

【讨论】:

  • 只有一个问题@Reti43 fmt = '%-5d' 是什么意思?我是初学者对不起
  • @Lucia 是字符串格式。你可以阅读更多关于它的信息here。具体来说,'%5d' % 6 将打印数字 6 向右对齐并占用 5 个空格,因此 ' 6',而其中的减号将使其左对齐:'6 '
  • 谢谢@Reti43,你帮了我很多:-)
【解决方案2】:

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2014-11-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-08-17
    • 1970-01-01
    • 2014-07-18
    • 2020-05-29
    相关资源
    最近更新 更多