Python程序失败,输入大于3位

时间:2014-01-06 04:59:51

标签: python

我正在Project Euler's problem 35我的代码失败,最大值超过999,但在此之前工作正常。

“计数”在22处停止,不计算999以上的任何素数。

import itertools
import time

def isPrime(n):
    if n % 2 == 0:
        return n == 2
    d = 3
    while d * d <= n:
        if n % d == 0:
            return False
        d += 2
    return True

t=time.time()
count=0
Range=1000000
for a in range(2,Range):   
    if isPrime(a):
        alist=[]
        perms=[]
        for n in str(a):
            alist.append(n)
        for n in itertools.permutations(alist):
            num=int("".join(n))
            perms.append(num)
        if all(isPrime(l) for l in perms):
            count+=1

print("there are ", count, " circular primes")
print("time=",time.time()-t,"s")

任何人都可以解释为什么会这样吗?

2 个答案:

答案 0 :(得分:4)

前四位循环素数是(我认为)1193.最简单的排除故障的方法就是看看这个数字会发生什么。问题是itertools.permutations生成所有排列,而不是循环旋转。 1193的循环旋转是

[1193, 3119, 9311, 1931]

您的代码生成了一个更大的列表:

[1931, 1913, 1391, 1319, 1193, 1139, 9131, 9113, 9311, 9311, 9113, 9131, 3191, 3119, 3911, 3911, 3119, 3191, 1193, 1139, 1913, 1931, 1319, 1391] 
例如,1391不是素数。

答案 1 :(得分:2)

你没有看到这个问题。你只想要轮换,而不是所有的排列。

这将生成要测试的旋转:

a_str = str(a)
perms = [ int(a_str[i:] + a_str[0:i]) for i in range(1,len(a_str)) ]