2013-10-29 43 views
0

我有一個計算素數在python中使用「all」和「any」關鍵字會給出意想不到的輸出?

def isPrime(n): 
    if (n==2): 
     return True 
    elif n<=1 or n%2==0: 
     return False 
    else: 
     for i in xrange(3,n/2, 2): 
      if n%i: 
      return False 
    return True 


mylist = [6,9] 

mylist2= [3,5,7,11,12] 

if not any(isPrime(x) for x in mylist): 
     print "No primes in list" 

if not all(isPrime(x) for x in mylist2): 
     print "Not all are primes numbers" 
當我運行這個程序

這下面的代碼,我得到

python calculate_primes.py 
Not all are primes numbers 

我不明白的No primes in list輸出。但如果我刪除mylist中的元素9,並且只有6,它工作正常。

python calculate_primes.py 
No primes in list 
Not all are primes numbers 

要麼是我的代碼有問題,要麼我錯誤地使用了any? 這裏有一些技巧請

+0

你甚至嘗試打印isPrime(9)'? – roippi

+0

檢查答案但除此之外,你也只需要從3循環到int(math.sqrt(n)),n/2是過度的。爲了進一步提高效率,請閱讀http://en.wikipedia.org/wiki/Sieve_of_Eratosthenes –

+0

我知道'sieve'算法,但我不知道'int(math.sqrt(n)'是否足夠。你解釋了爲什麼? –

回答

5

您的isPrime()函數有問題。如果條件n%i的計算結果爲True,那麼在for循環內您目前正在返回False,但只有在n而非才能被i整除。相反,您應該使用if not n%iif n%i == 0

+0

我需要一杯咖啡。我不能承擔這個錯誤! –

3

你想要if n%i == 0,而不是if n%i,因爲我只有在mod爲0時才分割n。當我沒有分割n時,你的代碼返回false。

相關問題