2013-08-04 3 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

당신은 모든 새로운 i에 대한 0 다시 divided_pass를 설정해야합니다.

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 - 목록 파이썬에서 반복자를, 그래서 당신이 for j in range(len(...))을 수행 할 필요가 없습니다 그냥 for j in prime_holder: if i % j != 0을 할 수 있습니다. 주어진 범위에서 소수를 찾는 더 좋은 구현이 있습니다 (여러분은 그것들을 조사해야합니다).

break이 없으면 else 부분이 실행되는 for-else 구조를 사용할 수도 있습니다. 이제 코드가 줄어 듭니다.

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 
당신이 매 사이클에 divided_pass의 값을 지워야합니다
+2

'for-else'를 완벽하게 사용합니다. – nneonneo

0

:

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 
관련 문제