2013-05-18 22 views
1

我想(和失敗)寫一個簡單的函數,檢查一個數字是否是素數。我遇到的問題是,當我得到一個if語句時,無論輸入如何,它似乎都在做同樣的事情。這是我有的代碼:爲什麼我的質數測試儀中的模數條件不起作用?

def is_prime(x): 
    if x >= 2: 
     for i in range(2,x): 
      if x % i != 0: #if x/i remainder is anything other than 0 
       print "1" 
       break 
      else: 
       print "ok" 
     else: 
      print "2" 
    else: print "3" 

is_prime(13) 

帶註釋的行是我確定問題的地方。無論使用什麼樣的整數作爲參數,它都打印「1」。我很抱歉可能是一個愚蠢的問題,我根本不是一個有經驗的程序員。

+4

您在這裏混合製表符和空格在您的文章。確保你沒有在你的實際文件中。用'python -tt'運行腳本並更正它報告的任何問題。最好將您的編輯器配置爲使用* only *空格進行縮進,遵循PEP 8 styleguide的建議。 –

+0

變量i在if語句上的值是多少? – scrineym

+0

@MartijnPieters不,我只在實際代碼中使用了選項卡,我在我的問題中添加了正確格式化代碼的空格。我試着用'python -tt'運行腳本,但仍然只有一個「1」。 – Taint

回答

3

您的代碼實際上非常接近實用。你在條件中只是有一個邏輯錯誤。

您可以對primality test進行一些優化,例如只檢查直到給定數字的平方根。

def is_prime(x): 
    if x >= 2: 
     for i in range(2,x): 
      if x % i == 0: # <----- You need to be checking if it IS evenly 
       print "not prime" # divisible and break if so since it means 
       break    # the number cannot be prime 
      else: 
       print "ok" 
     else: 
      print "prime" 
    else: 
     print "not prime" 
+0

+1用於指出平方根優化。 –

+0

非常感謝。我修改了條件,但現在它告訴我每一個數字_is_素數,所以這裏有什麼問題? 編輯:無法正確格式化代碼,但我所做的只是將條件更改爲「if x%i == 0:」並刪除條件語句的else語句。 – Taint

+0

嘗試完全複製代碼。它應該工作。 – Jared

0

嘗試使用return語句來代替(或補充)打印語句,如:

from math import sqrt # for a smaller range 

def is_prime(x): 
    if x <= 2: 
     return True 
    for i in range(2, int(sqrt(x)) + 1): 
     if x % i == 0: 
      print "%d is divisible by %d" % (x,i) 
      return False 
    return True  

is_prime(13) 
True 

is_prime(14) 
14 is divisible by 2 
False 
+0

'format()'是字符串格式化的正確方法。 – Elazar

2

的問題是這一行:

if x % i != 0: 

您正在測試,如果x % i 0,對於任何一對素數相對的整數都是如此(因此,您總是可以打印出來)

它應該是:

if x % i == 0: 
0

這種檢查可以是單個表達式:

def is_prime(n): 
    return n>1 and all(n%k for k in range(2,n//2)) 
相關問題