【问题标题】:Finding all circular prime numbers below a a given number in python在python中查找给定数字以下的所有圆形素数
【发布时间】:2020-05-13 19:14:06
【问题描述】:

我需要编写一个代码来生成低于任何给定数字的所有循环素数。我的代码有一些缺陷,它没有提供所有的循环素数,只是其中的几个。如果它们都低于我的给定数字,它只会显示所有圆形素数。 例如,如果upper = 200,它将不显示循环素数197。其他旋转是971 和719。但是,如果upper = 1000,它将显示所有3 个循环素数。 我不知道这是逻辑错误还是代码错误,但我们不胜感激。

from collections import deque
def gen_primes(upper):

    D = {}
    q = 2
    while q <= upper:
        if q not in D:
            yield q
            D[q * q] = [q]
        else:
            for p in D[q]:
                D.setdefault(p + q, []).append(p)
            del D[q]       
        q += 1 

def circular_primes(upper):
    circular = []

    primes = list(gen_primes(upper-1))

    for prime in primes:
        string = str(prime)
        digits = deque(string)

        for rotation in range(1, len(string)):
            digits.rotate(1)

            if int("".join(digits)) not in primes:
                break
        else:
            circular.append(prime)

    return circular
print(circular_primes(150))

【问题讨论】:

  • 您的素数列表只包含直到“上”的数字。但在您的第一个示例中,200
  • 我明白为什么不包括971,但197也不包括但小于200?
  • 因为只有当所有旋转都被列为素数并且旋转>200 未在“素数”中列出时,素数才会被视为圆形。
  • 啊,我明白了,非常感谢。
  • 任何包含数字 0、2、4、5、6 或 8 的多位素数都不能是素数,因为至少有一次旋转将以该数字结束,因此是合数。 2 和 5 都是个位数的素数,但不能出现在多位数的圆素数中。

标签: python primes circular-dependency


【解决方案1】:

代码修复

您没有创建涵盖所有可能旋转的素数。

添加计算大于 n 的最小数及其所有旋转的函数。

def next_largest(n):
  " For number n, returns number smallest number larger than all rotation of n "
  k = len(str(n))

  return 10**k

重构代码

from collections import deque
def gen_primes(upper):

    D = {}
    q = 2
    while q <= upper:
        if q not in D:
            yield q
            D[q * q] = [q]
        else:
            for p in D[q]:
                D.setdefault(p + q, []).append(p)
            del D[q]       
        q += 1 

def next_largest(n):
   " For number n, returns number smallest number larger than all rotation of n "
  k = len(str(n))

  return 10**k

def circular_primes(upper):
    circular = []

    print(next_largest(upper))
    primes = list(gen_primes(next_largest(upper)))  # code mod

    for prime in primes:
        string = str(prime)
        digits = deque(string)

        for rotation in range(1, len(string)):
            digits.rotate(1)

            if int("".join(digits)) not in primes:
                break
        else:
            circular.append(prime)

    return circular

测试

print(circular_primes(200))

输出

[2, 3, 5, 7, 11, 13, 17, 31, 37, 71, 73, 79, 97, 113, 131, 197, 199, 311, 337, 373, 719, 733, 919, 971, 991]

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-01-31
    • 2014-08-21
    • 1970-01-01
    • 2018-11-11
    相关资源
    最近更新 更多