【发布时间】: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