问题项目欧拉的35是为这样:Python - Project Euler#35 - 这种方法有什么问题?
数,197,被称为圆形素因的数字所有旋转:197,971,和719,它们本身的素数。低于2,3,5,7,11,13,17,31,37,71,73,79,和97。
多少圆形素数是否有:
有低于100 13米这样的素数一百万?
我的,比较简陋,方法是首先产生低于1百万的所有素数,然后筛选出所有包含连数字或数字5(因为总是会有一个非黄金置换)的素数。然后,对于这个简化的素数列表中的每个元素,使用itertools模块中的permutations()函数返回数字的所有可能排列,然后检查这些排列是否不是质数,如果是,则从元素中移除元素素数列表。
from itertools import permutations
def gen_primes(limit):
D = {}
q = 2
while q <= limit:
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 odd_primes(limit):
r = list(gen_primes(limit))
for i in r[:]:
for j in str(i):
if any(int(j)%2 == 0 or int(j) == 5 for j in str(i)):
r.remove(i)
break
r.extend([2,5])
return r
def circular_list():
prime_list = odd_primes(1000000)
for i in prime_list[:]:
perm = [''.join(j) for j in permutations(str(i))]
if any(int(j) not in prime_list for j in perm):
prime_list.remove(i)
break
return prime_list
print len(circular_list)
输出产生一个值,该值在某些边界上不正确。我一直在努力寻找逻辑或代码(或两者)中的错误。 permutations()函数是一种可行的方法吗?
我知道有更高效的方法,但如果有人能指出我朝这个方向努力的方向,我将不胜感激。
并非所有的排列都是旋转。 – jwodder
你知道'gen_primes'实际上是在锡上说的吗?另外你在'odd_primes'中的代码对我来说看起来很奇怪......我认为它试图从列表中删除其中包含2或5的素数 - 更快的方法可能是使用'in'(即。'str(i)中的if'2'或str(i)中的'5') –