2015-11-01 2 views
0

Я пытаюсь найти n-е число с использованием сита erathostenes. Да, я видел похожие сообщения, но у меня есть проблема с этой фрагментом кода. Я хочу остановить алгоритм, как только он найдет nth prime. Это то, что я написал:Python: найти n-е простое число

def nth_prime(n): 
    limit = 10**2 
    pn = 1      #keeps track of how many prime numbers we have found 
    sieve = range(3, limit, 2) 
    top = len(sieve) 
    for si in sieve: 
     if si: 
      pn += 1 
      print pn, si  #used to check while coding 
      if pn == n: 
       return si #loop breaks when the nth prime is found 
      else: 
        bottom = (si*si - 3)/2 
        if bottom >= top: 
         break 
        sieve[bottom::si] = [0] * -((bottom-top)//si) 

print nth_prime(11) 

Это не работает. По крайней мере, не так, как я хочу. Если я добавлю обратный фильтр (нет, сито) [n-2] он отлично работает. Но я хочу, чтобы он прекратил вычислять на n-м премьер. Это выход вместо:

2 3 
3 5 
4 7 
5 11 
None 

В то время как я бы ожидать, что она будет продолжаться до:

... 
11 31 

Если функция может вычислить все решето до предела правильно, почему не делает выход ведет себя так?

ответ

0

Python breakbreaks out of loops, not out of tests (if - else). Я заработал, переработав логику, чтобы исключить команду break. То есть,

if bottom < top: 
     sieve[bottom::si] = [0] * -((bottom-top)//si) 
Смежные вопросы