2013-08-04 6 views
1

Это основной генератор, который я сделал. Я должен иметь возможность генерировать простые числа до 20000. Он должен генерировать количество простых чисел, которые предоставляются ему в качестве аргумента. Тем не менее, он выполняет только до 11 и останавливает D :. Может ли кто-нибудь объяснить, что здесь не так?Почему мой основной генератор ломается?

def find_primes(limit): 
    prime_holder = [2, 3, 5 ,7] 
    divided_pass = 0 
    for i in range(11, 20000): 
     for j in range(0, len(prime_holder)): 
      if i%prime_holder[j] != 0: 
       divided_pass += 1 
     if divided_pass == len(prime_holder): 
      prime_holder.append(i) 
      divided_pass = 0 
     if len(prime_holder)-1 == limit: 
      break 
    return prime_holder 

my_primes = find_primes(50) 
for x in my_primes: 
    print x; 
raw_input() 
+1

Если вы генерируете все простые числа в этом диапазоне, вы должны использовать [Решето Эратосфена] (HTTP://en.wikipedia.org/wiki/Sieve_of_Eratosthenes). –

+0

Я сделал сценарий на основе SoE. Но этот сценарий был первым, что я сделал. Это не сработало, и я не мог понять, почему. – Stormboy

ответ

2

Вам нужно установить divided_pass назад 0 для каждого нового i.

def find_primes(limit): 
    prime_holder = [2, 3, 5 ,7] 
    for i in range(11, 20000): 
     divided_pass = 0 
     for j in range(0, len(prime_holder)): 
      if i%prime_holder[j] != 0: 
       divided_pass += 1 
     if divided_pass == len(prime_holder): 
      prime_holder.append(i) 
     if len(prime_holder)-1 == limit: 
      break 
    return prime_holder 

>>> print find_primes(50) 
[2, 3, 5, 7, 11, 13, 17, 19, 23, 29, 31, 37, 41, 43, 47, 53, 59, 61, 67, 71, 73, 79, 83, 89, 97, 101, 103, 107, 109, 113, 127, 131, 137, 139, 149, 151, 157, 163, 167, 173, 179, 181, 191, 193, 197, 199, 211, 223, 227, 229, 233] 

P.S - Списки являются Iterable в Python, так что вам не нужно делать for j in range(len(...)) и может просто сделать for j in prime_holder: if i % j != 0. Существуют лучшие реализации для нахождения простых чисел в заданном диапазоне (вы должны изучить их).

Вы также можете использовать конструкцию for-else, где находится часть else, если встречается break. Теперь ваш код будет уменьшен.

def find_primes(limit): 
    prime_holder = [2, 3, 5 ,7] 
    for i in range(11, 20000): 
     for j in prime_holder: 
      if i%j == 0: 
       break 
     else: 
      prime_holder.append(i) 
     if len(prime_holder)-1 == limit: 
      break 
    return prime_holder 
+2

Идеальное использование для 'for-else'. – nneonneo

0

вы должны очистить значение divided_pass на каждом цикле:

def find_primes(limit): 
    prime_holder = [2, 3, 5 ,7] 
    divided_pass = 0 
    for i in range(11, 20000): 
     for j in range(0, len(prime_holder)): 
      if i % prime_holder[j] != 0: 
       divided_pass += 1 
     if divided_pass == len(prime_holder): 
      prime_holder.append(i) 
     divided_pass = 0 
     if len(prime_holder)-1 == limit: 
      break 
    return prime_holderdivided_pass 
Смежные вопросы