2013-10-15 46 views
0

嗨,我做了一個函數,檢查一個數字是否是素數,但它告訴我,9是素數。Python,質數檢查器

def eprimo(num): 
    if num < 2: 
     return False 
    if num == 2: 
     return True 
    else: 
     for div in range(2,num): 
      if num % div == 0: 
       return False 
      else: 
       return True 
+0

這是什麼問題? – Alexis

+1

逐步通過您的代碼。你有什麼嘗試? – UpAndAdam

+0

就像效率筆記一樣,您只需要從2到num/2 –

回答

2

無論您是否完成檢查,您將從該循環的第一次迭代中返回。除非數字絕對不是素數,否則不應從循環內部返回。如果循環結束,則刪除else並僅返回True

def eprimo(num): 
    if num < 2: 
     return False 
    if num == 2: 
     return True 
    else: 
     for div in range(2,num): 
      if num % div == 0: 
       return False 
     return True 

優化旁註:你真的不需要檢查所有除數考生達num。您只需要檢查num的平方根。

6

您的for循環會在第一次迭代之後立即退出,以檢查您的號碼是否可以被2整除。如果您的號碼是偶數,則返回False;否則,將返回True

解決方法是不立即返回True;等待中循環,而不是所有迭代結束:

for div in range(2, num): 
    if num % div == 0: 
     return False 
return True 

另外,使用all()結構:

return all(num % div != 0 for div in range(2, num)) 
0

取而代之的測試範圍內(2,NUM)所有的除數,你可以提取對偶數進行測試,然後僅對奇數進行循環。此外,正如蜥蜴提示的那樣,你可以在數字的平方根處停下來。這將快兩倍:

def eprimo(num): 
    if num < 2: 
     return False 
    if num % 2 == 0: 
     return num == 2 
    div = 3 
    while div * div <= num: 
     if num % div == 0: 
      return False 
     div += 2 
    return True