2013-10-05 34 views
1

此代碼有什麼問題?僅使用循環和if語句打印素數

import math 
y=1 
z=y 
while z>= 1 and z<1000 : 
    z= 2*y + 1 
    y=y+1 
    for a in range (2,int(math.sqrt(z) + 1)): 
     if z%a != 0: 
      print(z) 
     else: 
      break 

這裏有什麼問題?我不斷收到複合數字。

回答

1

對於ž是一個素數,它必須是不存在任何數量情況下,這樣2 <= a <= sqrt(z)一個ž的一個因素。我會將您的代碼更改爲:

import math 
y=1 
z=y 
while z>= 1 and z<1000 : 
    z= 2*y + 1 
    y=y+1 
    if all(z%a != 0 for a in range (2,int(math.sqrt(z) + 1))): 
     print(z) 
1

即使打印號碼不能被一個數字整除,但可被另一個數字整除。

打印應該在循環之外。

import math 
y=1 
z=y 
while z>= 1 and z<1000 : 
     z= 2*y + 1 
     y=y+1 
     flag=0 
     for a in range (2,int(math.sqrt(z) + 1)): 
      if z%a == 0: 
       flag=1 
       break 
     if flag==0: 
      print z 

,以提高你的算法將是6的倍數爲移動和檢查是multipleofsix-1multiple of six+1這會給你一個更好的效率數的另一種方式。除2和3外,所有其他素數都可以在該範圍內找到。

進一步的改進將要求您維護一個數組並存儲所有先前的素數,並且只將其除以所檢查數字的平方根以下的所有素數。

還有更好的即興創作,如Eratosthenes和Atkins的篩選,但這些是您可以實現的最基本的。

+0

我無法獲得您的國旗聲明...... ???我是一個初學者,我onli knw ..如果語句,while循環.. – sidchelseafan

+0

國旗只是一個變量。它存儲0,如果該數字不可被從a到'range(2,int(math.sqrt(z)+1)'中的任何數字不可分割' '只要其中一個數字完全除以'如果z%a = = 0'該標誌變爲1. 只有當該標誌爲0時纔是打印的數字,否則它可以被其他數字整除,因此不是質數。 – Sohaib

+0

不要忘記標記爲正確/ upvote,如果找到它有用的。這就是這個社區的功能 – Sohaib