2014-12-05 2 views
1

저는 파이썬을 처음 접했고 프로젝트 오일러 문제를 수행하여 프로그래밍을 연습하려고합니다. 7th problem을 해결하기 위해, 나는 for 루프를 사용하여 간단한 프라임 생성 함수를 작성하기로 결정했다.파이썬의 소수 생성자가 소수 대신 여러 개의 합성물을 반환합니다.

primes = [2] 

for n in range(2, 10): 
    for m in range(2, n): 
     if not(n % m): 
      primes.append(n) 

print primes 

출력 대신 내가 의도의 [2,4,6,6,8,8,9]이다, 즉 [2,3,5,7] :

여기 내 코드입니다. 수학은 정확합니다. n, 2보다 큰 자연수를 선택하십시오. 1보다 큰 모든 자연수가 n보다 작 으면 nm으로 나눌 수 있는지 확인하십시오. 그렇지 않다면 n을 소수의리스트에 추가하십시오. 아무도 내 코드에 문제가 있다고 말할 수 있습니까?

P. 소수를 생성하는 몇 가지 다른 (더 나은) 방법이 있다는 것을 알고 있지만, 나는 접근법 (코드)을 만드는 데 관심이있다.

답변

3

not(n % m)이 아니고 소수인지 알려줍니다.

숫자가 소수인지 아닌지 알기 전에 모든 후보 요소에 대해이를 수행해야합니다.

for에서 깨지지 않은 경우에만 else 블록을 실행하는 for: else:에 Python이 매우 편리한 메커니즘을 제공합니다.

primes = [] 
for n in range(2, 10): 
    for m in range(2, n): 
     if not(n % m): 
      break 
    else: 
     primes.append(n) 

당신은 발전기 식 유사한 방식으로 소수도 테스트 할 수 있습니다 : 그것은 반복을 시작하기 전에 번호의 전체 목록을 생성으로

prime = not(any(n % m == 0 for m in range(2, n))) 

range 파이썬 2.x에서의 비효율적입니다 기억하십시오. Python 3.x를 사용하지 않는 한 xrange을 사용하십시오.

+0

우수 답변! 당신의 도움을 주셔서 감사합니다. – chubbycantorset

+0

제안에 따라 break 및 else 문을 추가하고 [2, 3, 5, 5, 5, 7, 7, 7, 7, 7, 9]을 출력으로 보았습니다. 5와 7을 여러 번 반환하는 이유를 알고 있습니까? – chubbycantorset

+0

다른 사람을 잘못 넣었습니까? 그것은 내가 제출 한 정확한 코드를 실행할 때 얻는 결과가 아닙니다. – lunixbochs