2010-06-29 4 views
0

프로젝트 오일러로 돌아가서 계정과 솔루션을 잃어 버렸으므로 문제 7로 돌아갑니다. 그러나 코드가 작동하지 않습니다. 그것은 아주 초등 나를 보인다, 누군가가 내 (짧은) 스크립트를 디버깅하는 데 도움이 될 수 있습니까?Python 구문 문제

10001st 프라임을 찾아야합니다.

#!/usr/bin/env python 
#encoding: utf-8 
""" 
P7.py 

Created by Andrew Levenson on 2010-06-29. 
Copyright (c) 2010 __ME__. All rights reserved. 
""" 

import sys 
import os 
from math import sqrt 

def isPrime(num): 
    flag = True 
    for x in range(2,int(sqrt(num))): 
     if(num % x == 0): 
      flag = False 
    if flag == True: 
     return True 
    else: 
     return False 

def main(): 
    i, n = 1, 3 
    p = False 
    end = 6 
    while end - i >= 0: 
     p = isPrime(n) 
     if p == True: 
      i = i + 1 
      print n 
     n = n + 1 

if __name__ == '__main__': 
    main() 

편집 * : 죄송합니다. 문제는 모든 숫자가 소수라는 것입니다. :/

+1

오류는 무엇이라고 말합니까? – SilentGhost

+0

-1. 구문 문제는 "n + */3"입니다. 언제 작동합니까? 언제 작동하지 않습니까? 의도 한 행동과 어떤 점에서 다른가? –

+0

미안하지만, 나는 "2010-06-29에 Andrew Levenson에 의해 작성되었습니다. Copyright (c) 2010 __ME__. 판권 소유." :) 범죄의 의미는 원시적 인 스크립트의 이런 종류의 스크립트는 이미 수천 개의 다른 사람들이 작성한 것임을 의미합니다. – houbysoft

답변

5

구문은 (파이썬 2) 괜찮습니다. 의미는 어떤 피할 합병증을 가지고 있으며,이 오프별로 한 버그 : 2 Y에 포함를 제외에서

for x in range(2,int(sqrt(num))): 
    if(num % x == 0): 
     flag = False 

range(2, Y) 간다 - 너무 자주 간주하는함으로써 가능한 마지막 제수를 확인하고 아니에요 " 소수 "는 많지 않은 숫자입니다. 가장 간단한 해결책으로 range에서 1 + int(...을 사용해보세요. 그 후, 그 피할 수있는 합병증을 제거하는 것이 좋습니다 : 예를 들어, return somebool 간단한이 같은 일을 같은

if somebool: return True 
else: return False 

은 보증되지 않습니다. 이미 설명했다

from math import sqrt 

def isPrime(num): 
    for x in range(3, int(1 + sqrt(num)), 2): 
     if num % x == 0: return False 
    return True 

def main(): 
    i, n = 0, 3 
    end = 6 
    while i < end: 
     if isPrime(n): 
      i += 1 
      print n 
     n += 2 

if __name__ == '__main__': 
    main() 

는 "당신이 답을 알고 즉시 반환"

(그렇지 않으면 정확히 동일한 알고리즘 단지 필수 불가결 최적화 만 포함) 전체 코드의 단순화 된 버전은 예를 들어, 수 있습니다 우리는 멍청하지 않은 짝수가 3이고, 같은 이유로 range의 비틀기가 있다는 것을 "알기 때문에"n에 대해 1 대신에 더 중요한 최적화 (+ = 2, 1 대신에)를 추가했습니다.

그것은 예를 들어, 귀엽 얻을 가능성이 있지만

def isPrime(num): 
    return all(num % x for x n range(3, int(1 + sqrt(num)), 2)) 

당신이 그것을 저장하기 때문에 all 내장, 정말, 당신은 할 필요 익숙하지 않은 경우 "간단하게"보일 수 있습니다 함수의 핵심 아이디어를 표현하기위한 적절한 수준의 추상화에 찬성하여 저수준 논리를 따르는 코드 판독기 (및 코드 판독기)가 있습니다. 즉, 가능한 모든 모든 제수가 [[0이 아닌]] (즉, 정확하고 실행 가능한 형태로 개념을 직접 표현하십시오). 알고리즘은 실제로 여전히 동일합니다.

는 ... 더 나아가 : 포함 (3)로부터의 홀수의 시퀀스의 발생 (: 다시

import itertools as it 

def odd(): 
    for n in it.count(1): 
     yield n + n + 1 

def main(): 
    end = 5   
    for i, n in enumerate(it.ifilter(isPrime, odd())): 
     print n 
     if i >= end: break 

, 이것은 이전과 마찬가지로, 단지 추상화보다 적절한 레벨로 표현 된 동일한 알고리즘 위쪽으로) 자신의 odd 생성기에 배치하고, 부적절한 (및 불필요한) 저수준 표현/추론을 피하기 위해 enumerate 내장 및 itertools 기능을 사용합니다.

반복 : 기본적인 최적화는 적용되지 않았습니다. 적절한 추상화 만 적용됩니다. Python에서 무제한 연속 소수 생성 (예 : 개방 끝이있는 에라 토 스테 네스 시브 (Erasosthenes Sieve) 접근법을 통한 최적화)은 다른 곳에서 심도있게 논의되었습니다. here (댓글도 확인해야합니다.) 여기서는 enumerate, allany과 같은 내장 함수와 함께 중요한 숫자 인 itertools에 발전기 및 생성기 표현식을 사용하여 많은 "루핑"문제를 현대 Python에서보다 적절한 추상화 수준으로 표현할 수있는 방법에 중점을 두었습니다. 대부분의 프로그래머에게 가장 자연스럽게 보일지도 모르는 "C-inspired"코드는 C 프로그래밍 등을 통해 개발되었습니다. (아마도 놀랍게도 Stepanov에 의해 처음 발견 된 C++의 "추상화 패널티"에 익숙한 학자들에게는 대단히 빠른 속도로 잘 알려진 itertools이 광범위하고 적절하게 사용되는 경우 특히 일반적으로 파이썬은 "추상화 프리미엄"을 갖는 경향이 있습니다. 그건 정말 다른 주제입니다 ;-).

+0

"Flag"가 거짓 인 후 중복 체크는 말할 것도없고, 내 대답 – Eric

+0

@ Eric에서와 같이, 확실하지만 여분의 작업이긴하지만 _complication_ ;-)이 아닙니다. 'somebool == True :'OP가 자주하는 것은 관련없는 부수적 인 합병증입니다. 정확성 바로 전과 속도 전에 초점을 맞추 었습니다. –

+0

감사합니다. Range가 상한이 아니라 상한을 지정했는지 알지 못했습니다. – Andy

1

더 좋지 않습니까?

def isPrime(num): 
    for x in range(2,int(sqrt(num))): 
     if(num % x == 0): 
      return False 
    return True 

그리고이 :

def main(): 
    i, n = 1, 3 
    while i <= 6: 
     if isPrime(n): 
      i = i + 1 
      print n 
     n = n + 1 

는 또한, 난 아무데도 거기에 10001을 보이지 않아요 ...

+0

'isPrime' 함수는 OP와 똑같은 버그를 가지고 있습니다. 제 대답을보십시오. –

+0

사실. 나는 단지 불필요한 코드를 지적했다. 나는 당신의 수정을 훔치는 것이 무례 할 것이라고 생각했다. – Eric

+0

죄송합니다. '10001'은 디버깅 목적으로 '6'으로 바뀌 었습니다. – Andy