蟒蛇。项目欧拉Q35。有一个解决方案,但我不明白为什么其他方法不起作用。

时间:2011-08-28 11:08:43

标签: python

def rot_dig(x):
    y=''
    output=[x]
    listing=list(x)
    for i in range(1,len(x)):
        listing.append(listing[0])
        del(listing[0])
        for i in listing:
            y=y+i
        output.append(y)
        y=''
    return output

import math

def prime_is(x,prime):
    for m in prime:
        if m<=math.sqrt(x):
            if x%m==0:
                return False
        else:
            return True

prime=[2]
for x in range(3,1000000):
    if prime_is(x,prime):
        prime.append(x)

primestr=[]
for x in prime:
    primestr.append(str(x))

sums=0
for x in primestr:
    count=0
    for y in rot_dig(x):
        if y in primestr:
            count+=1        
    if count==len(x):
        sums+=1
    else:
        for y in rot_dig(x):
            if y in primestr:
                primestr.remove(y)

print sums

使用粗体代码运行时,解决方案会错过最终轮换。因此,如果它看起来说1193,它包括1193,3119,9311但不包括1931.我花了一段时间试图找出原因,但我没有得到它。

我已经编辑了代码,使其更快,并通过简单地删除代码块解决了我遇到的问题,但我无法理解为什么会发生这种情况,因为肯定的是代码块只会在非循环上执行素数。

1 个答案:

答案 0 :(得分:1)

这可能是因为您的外部循环为for x in primestr:,并且标记的代码会从primestr中删除项目。您不希望在以这种方式循环时更改primestr。您可以使用类似while i < len(primestr)的循环。

其他一些改进是在循环外计算sqrt;使用列表推导而不是循环来创建primestr;特别是在rot_dig中使用字符串切片,它的方式比它需要的更复杂。