2014-01-06 49 views
1

我在做Project Euler's problem 35,我的代碼失敗,最大值超過999,但在此之前工作正常。Python程序失敗,輸入大於3位數

「計數」停在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") 

任何人都可以明白爲什麼發生這種情況?

+0

定義 「失敗」?它是否拋出異常,錯誤地計算? – 2014-01-06 05:01:11

+0

那麼,你有沒有嘗試輸出素數列表?你怎麼知道22錯了?等等... – 2014-01-06 05:03:52

+0

是的,我嘗試了所有這些,圓形素數的維基給出了大量的值。 – user3164199

回答

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,例如,是不是素數。

+0

Ahhhh就是這樣,我認爲這是一個愚蠢的錯誤,謝謝! – user3164199

2

你沒有看到問題。你只需要旋轉,而不是所有的排列。

這將產生旋轉測試​​:

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