2012-05-05 2 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() работает отлично. Функция primeNumbers отлично работает, когда числа = 0. Но если число = 1, то, как мне кажется, один из циклов никогда не останавливается, я не могу understan почему ...

+5

Для начала прочитайте PEP 8, чтобы написать более читаемый код. – rubik

+5

Кроме того, не используйте строки типа «Да» или «Нет», но предпочитают логические значения («Истина» и «Ложь»). – 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 (простые числа) + 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 

Я сделал немного изменить саму программу.

Смежные вопросы