2012-11-17 3 views
0
def all_primes(start,end): 
    list_nonprimes = [] 
    list_primes = [] 

    for i in range(start,end): 
     for a in range(2,i): 
      if i % a == 1 and i not in list_nonprimes: 
       if i not in list_primes: 
        list_primes.append(i) 
      else: 
       list_nonprimes.append(i) 

    return list_primes 

왜 출력이 잘못 되었습니까?특정 세트에서 모든 소수를 얻으려면 어떻게해야합니까?

>>> all_primes(1,10) 
[3,5,7,9] 

9를 어떻게 제거합니까?

+3

이 너무 – xbonez

+1

왜 루프 범위 '를 통해 주요 고려된다 (2, I)'이미'i'보다 소수의 모든 목록이있는 경우? – Amber

+0

다음은 '모든'과 '모든'에 대해 배우는 데 관심이있을 것입니다. 나는 list_primes.append (i)가'for-else'보다 더 잘 읽는다는 것을 알 수있다. – DSM

답변

4

덜 현재 확인하고있는 수보다,이 작업을 수행하는 더 간단한 방법이있다 :

def all_primes(start,end): 
    list_primes = [] 

    for i in range(2,end): 
     for a in list_primes: 
      if i % a == 0: 
       break 
     else: 
      list_primes.append(i) 

    return [x for x in list_primes if x >= start] 

이를 이해하는 열쇠가 알고있다 방법 for...else 파이썬에서 작동합니다. 본질적으로 for 루프는 else 문을 가질 수 있으며 루프 평가 중에 break 문을 실행하지 않은 경우에만 실행됩니다.

+0

이 감사를 알지 못했습니다. for 루프에서 else를 사용하는 방법과 코드의 마지막 줄에서 사용하는 방법에 대해 자세히 설명해 주시겠습니까? –

+0

물론입니다. 'for ... else'는 꽤 많이 설명되어 있습니다. 보통의 for 루프와 같고,'for' 루프가'break'없이 끝나면'else' 부분이 실행됩니다. 마지막 줄은 [목록 이해력] (http://docs.python.org/2/tutorial/datastructures.html#list-comprehensions)입니다. – Amber

0

변화는 그것에서 :

 if i % a == 1 and i not in list_nonprimes: 
      if i not in list_primes: 
       list_primes.append(i) 
     else: 
      list_nonprimes.append(i) 

에 : 제외

 if i % a == 0 and i not in list_primes: 
      if i not in list_nonprimes: 
       list_nonprimes.append(i) 
     else: 
      list_primes.append(i) 

: 당신은 대신 Sieve of Eratosthenes을 구현 고려할 수 있습니다. 이해하기 쉽고 훨씬 효율적입니다. 이미 본질적으로 소수의 목록을 생성하고 이후

+1

그건 맞지 않아. all_primes (1, 10)은 이제 [4, 6, 8]을 반환합니다. 아마 '만약 내가 % a! = 0 ...'? – threenplusone

+0

@threenplusone, sry, 아직 편집 중이었습니다. 'i % a == 1'은 비 (非) 프라임의 유일한 조건 일 뿐이므로 논리를 교환해야했습니다. 대신에 무언가가 소수인지 확인하고'if i % a == 0 '을 확인하여 제거해야합니다. –

0

내가 잘못 가고있는 곳을보기 위해 코드를 살펴 보았지만 꽤 많이 변경되고 최적화되었습니다. 나는 코드를 주석 처리 했으므로 희망적으로 설명된다.

def all_primes(start,end): 
    list_nonprimes = [] 
    list_primes = [] 

    for i in range(start,end): 
     # if already present in non_primes, skip 
     if i in list_nonprimes: continue 

     # if already present in primes, skip 
     if i in list_primes: continue 

     # if 2, mark it as prime. Special case 
     if i == 2 : 
      list_primes.append(i) 
      continue 

     # even numbers are not prime 
     if i%2 == 0: 
      list_nonprimes.append(i) 
      continue 

     # only check divisibility with odd numbers starting at 3 
     # and ending at sqrt(i) 
     for a in range(3,int(i**0,5)+1,2): 
      if i % a == 0 : 
       list_nonprimes.append(i) 
       break 

     # if we got here, and the number wasn;t added to non_primes 
     # it must be a prime 
     if i not in list_nonprimes: list_primes.append(i)    

    return list_primes 

start = 2 
end = 10 
print all_primes(start, end) 

Demo

관련 문제