【问题标题】:Palindromic prime number in pythonpython中的回文素数
【发布时间】:2014-05-07 03:14:55
【问题描述】:

所以我想弄清楚如何找到两个数字之间的所有回文素数。 到目前为止,我的代码可以找到回文,但是当我检查素数时,它也会打印出非素数。并且有多次打印的数字。

你能帮忙吗?

谢谢。

a = 0
b = 500
a += 1   
for i in range(a,b):
    if(str(i) == str(i)[::-1]):
        if(i>2):
            for a in range(2,i):
                y = True
                if(i%a==0):
                    y = False
                    break
            if y:
                print(i)

【问题讨论】:

  • 进一步模块化代码可能会有所帮助,即添加is_prime()函数和is_palindrome()函数。这肯定会让它更具可读性python的标志
  • print(i)在回文检查后立即
  • 也不要再将y 设置为True
  • 你在测试回文后立即使用打印,而不考虑素数
  • 另外,你能解释一下最后一行的用途吗?

标签: python python-3.x primes palindrome


【解决方案1】:

请在下面查看我的 cmets:

a = 0
b = 500
a += 1
y = True
for i in range(a,b):
    if(str(i) == str(i)[::-1]):
        print (i)      # <--- You print every number that is a palindrome
        if(i>2):
            for a in range(2,i):
                if(i%a==0):
                    y = False   # <--- This never gets set back to True
                    break
            if y:
                print(i)

        i+=i   # <--- This is doing nothing useful, because it's a "for" loop

【讨论】:

    【解决方案2】:

    根据您最近的代码,您只需确保为您测试的每个数字重置y,它是您的素数的积极指标。否则,当您到达第一个合数 4 时,它将保持False

    >>> a = 0
    >>> b = 500
    >>> a += 1
    >>> for i in range(a,b):
            y = True
            if(str(i) == str(i)[::-1]):
                if(i>2):
                    for a in range(2,i):
                        if(i%a==0):
                            y = False
                            break
                    if y:
                        print(i)
    
    
    3
    5
    7
    11
    101
    131
    151
    181
    191
    313
    353
    373
    383
    

    As you can see, all of these are prime. 您可以检查 wolframalpha 提供的素数列表,以确保没有遗漏回文素数。如果要包含 2,请为此添加一个特殊情况。

    【讨论】:

    • 我得到了完全相同的东西。我虽然有些丢失了,因为我有一段时间忘记了我正在寻找的回文素数。非常感谢。
    • 我还是看不出来,为什么if(i&gt;2)这个条件是必要的。这就是阻止打印数字 2 的原因,因此应将其更改为 if(i&gt;1),或者为了更好的效率,将其完全删除,并使用 a = max(a+1, 2) 行而不是 a += 1 行。
    【解决方案3】:

    看看我下面的代码,我们也不需要初始化 Y。 For-Else 块效果很好。

    a = 0
    b = 500
    a += 1
    for i in range(a,b):
        if(str(i) == str(i)[::-1]):
            if(i>1):
                for a in range(2,i):
                    if(i%a==0):
                        y = False
                        break
                else:
                    print(i)
    

    要让答案中包含 2,请务必检查 @elias 提到的 if 条件为 (i>1)

    【讨论】:

      猜你喜欢
      • 2015-06-28
      • 1970-01-01
      • 2016-07-15
      • 2014-05-26
      • 1970-01-01
      • 2012-03-23
      • 1970-01-01
      • 2014-04-28
      • 2021-02-25
      相关资源
      最近更新 更多