Skip to main content
 首页 » 编程设计

Python。欧拉计划 Q35。找到了解决方案,但我不明白为什么其他方法不起作用。

2025年05月04日12sxdcgaq8080

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 
    <b>else: 
        for y in rot_dig(x): 
            if y in primestr: 
                primestr.remove(y)</b> 
 
print sums

当使用粗体代码运行时,解决方案会错过最后的旋转。因此,如果它查看 1193,它包括 1193、3119、9311,但不包括 1931。我花了一段时间试图找出原因,但我不明白。

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

请您参考如下方法:

可能是因为你的外循环是for x in primestr:并且标记的代码从 primestr 中删除项目.你不想改变 primestr以这种方式循环。您可以使用类似 while i < len(primestr) 的循环相反。

其他一些改进是计算 sqrt在循环外;使用列表理解而不是循环来创建 primestr ;尤其是在 rot_dig 中使用字符串切片,它比它需要的要复杂得多。