2012-05-05 94 views
1

我知道,關於素數已經有很多問題了,但我並沒有要求提供代碼。我只是想知道,什麼是錯的我的(我希望意見將幫助你理解,我在做什麼):使用python進行素數計算

from math import ceil 

def isPrimeNumber (n, out='short'): #Checks, whether n is a prime number 
    answer = 'Yes' 
    for p in range(2, int(ceil(n**0.5))+1): #Checks all numbers lower than 
              #SQRT(n), if they are divisors of n 
     if n%p == 0: #If p is a divisor, n isn't prime 
      answer = 'No' 
      if out == 'verbose': 
       print 'Least divisor is', p 
      return False 
      break 
    if answer == 'Yes': #If there isn't a p, that is a divisor, n is prime 
     if out == 'verbose': 
      print 'No divisors except for 1 and', str(n)+'!' 
     return True 

def primeNumbers (start = 1, stop = 1000, numbers = 0): 
    N = stop 
    if numbers == 0: #Calculates all prime numbers in N numbers in a row 
        #(N=1000 -> calculates all prime numbers in 1000 numbers, 
        #by default from 1 to 997) 
     primes = [] 
     for i in range(start, N+1): 
      if isPrimeNumber(i) == True: 
       primes.append(i) 
    elif numbers == 1: #Calculates N prime numbers in a row 
         #(N=1000 -> calculates 1000 prime numbers) 
     primes = [start] 
     i = len(primes) 
     j = 1 
     while i <= N: #Stops, when we get N prime numbers - doesn't work! 
      n = max(primes) + 1 
      while j != 'stop': 
       if isPrimeNumber(n, out='short') == True: 
        primes.append(n) 
        i = i + 1 
        j = 'stop' #Stops nested cycle, when reached 
           #the first prime number 
       else: 
        n = n + 1 
    else: 
     print 'Wrong input! 3rd number in function call must be either 0 or 1' 
    return primes 

功能isPrimeNumber()工作正常。當數字= 0時,函數primeNumbers也可以正常工作。但是,如果數量= 1,那麼,因爲它似乎,週期永不停歇的一個,我不能understan爲什麼...

+5

作爲開始,您應該遵循PEP 8編寫更多可讀代碼。 – rubik

+5

另外,不要使用「Yes」或「No」這樣的字符串,但更喜歡布爾值('True'和'False')。 – rubik

+0

我想跟着它,但我剛剛開始編程,首先我想學習編寫工作代碼。但是謝謝你! 嗯,不知道,爲什麼我沒有在那裏使用布爾值,因爲我在同一個程序的不同地方使用它們......謝謝! – Phlya

回答

1

問題是,你的j變量最終被設置爲'停止',然後再也沒有設置回來,所以while j!='stop'只能在第一次運行。

# don't initialize j here 
    while i <= N: #Stops, when we get N prime numbers - doesn't work! 
     n = max(primes) + 1 
     j = 1 #initialize it here 
     while j != 'stop': 
      if isPrimeNumber(n, out='short') == True: 
       primes.append(n) 
       i = i + 1 
       j = 'stop' #Stops nested cycle, when reached 
          #the first prime number 
      else: 
       n = n + 1 
+0

謝謝!你是對的,它現在起作用了! – Phlya

2

你有一個無限循環就在這裏:

while i <= N: 
     n = max(primes) + 1 ### resetting `n'! 
     while j != 'stop': 
      if isPrimeNumber(n, out='short') == True: 
       ... 
       j = 'stop' 
      else: 
       n = n + 1 

一旦j是設置爲'stop',你永遠不會改回它。一旦發生這種情況,內部while實際上成爲無操作,將外部while變成無限循環。

+0

恩,所以外環是無限的?但是,實際上,每次運作時,n = max(primes)+ 1是不同的,因爲素數應該得到一個新數字,不是嗎? – Phlya

+0

@Ilya:請參閱編輯以獲得更準確的分析。 – NPE

+0

是的,謝謝! – Phlya

0

我只是想我會清理有點...

from math import ceil 
def isprime (n,out="short"): 
    answer = True 
    for p in range(2,int(ceil(n ** 0.5)) + 1): 
     if n % p == 0: 
      answer = False 
      if out == "verbose": 
       print "Least Divisor: " + str(p) 
      return False 
    if answer: 
     if out == "verbose": 
      print "No Divisors (Except For 1 & " + str(n) + "!" 
     return True 
def primenumbers (start = 1,stop = 1000,numbers = False): 
    N = stop 
    if numbers: 
     primes = [start] 
     i = len(primes) 
     j = 1 
     while i <= N: 
      n = max(primes) + 1 
      j = true 
      while j: 
       if isPrimeNumber(n): 
        primes.append(n) 
        i = i + 1 
        j = false 
       else: 
        n = n + 1 
    else 
     primes = [] 
     for i in range(start,N + 1): 
      if isPrimeNumber(i): 
       primes.append(i) 
    return primes 

我也稍微改變實際的程序。