2011-11-08 4 views
0

어디에서 print 문을 써서 최종 목록을 인쇄 할 수 있습니까? 반환 값은 그대로 유지되며이 기능을 개선하기 위해 생각할 수있는 방법이 있습니까? 나는 기능을 썼다 그러나 즉시 반환하기 전에 상대 품질파이썬 Print 문을 루프로 처리하여 소수를 생성

def buildPrimeList(): 

    primeList = [1, 2] 
    possiblePrime = 3 
    print "To display all prime values less than or equal a number..." 
    x = raw_input("Enter a number higher then 3 ") 
    while (possiblePrime <= x): 
     divisor = 2 
     isPrime = True 

    while (divisor < possiblePrime and isPrime): 
     if (possiblePrime % divisor == 0): 
      isPrime = False 
     divisor = divisor + 1 

    if (isPrime): 
     primeList.append(possiblePrime) 

    possiblePrime = possiblePrime + 2 

    return primeList 


buildPrimeList() 

답변

1

당신은 목록을 print 수에 관해서는 확실입니다.

알고리즘의 효율성에 대해서는 sieve of erathostenes을 고려하십시오.

+0

쓰기가 쉽기 때문에 숫자가 더 낮은 이미 발견 된 소수로 나눌 수 있는지 확인하는 것이 쉬울 수도 있습니다. 그것이 아니라면, 그것은 소수입니다. (예 : 3은 2로 나눌 수 없다 -> 소수이며, 15는 3으로 나눌 수 있으며, 17은 2,3,5,7,11,13으로 나눌 수 없다 -> 소수 임). 우리가 테스트하는 숫자의 절반 이상은 무시할 수 있지만 속도에 어떤 영향을 미치는지 확신 할 수 없습니다. – rplnt

+2

더 정확하게 : 약수를 찾을 때 숫자의 절반이 아닌 테스트중인 숫자의 _root_에서 멈출 수 있습니다. 왜 원래 대답이 아니라 내 대답에 대해 의견을 말하고 있습니까? :) –

+0

그는 인쇄물에 대해 묻는 중이었고 구현에 관한 것이 아니므로 응답을 게시하지 않으려 고했습니다. 그리고 제곱근을 가진 좋은 전화. 구현 및 결과 : https://gist.github.com/1347474 – rplnt

2

이 함수의 결과를 인쇄하는 것은 매우 솔직 :

x = int(raw_input("Enter a number higher then 3 ")) 

:

또한
print buildPrimeList() 

난 당신이 int로 (문자열) raw_input을의 결과를 변환하지 않는 것으로 나타났습니다

처럼 보일 수 있습니다 파이썬에서 같은 일을 할 수있는 또 다른 방법 :

from itertools import count 

def is_prime(n): 
    """Checks if given number 
    n is prime or not.""" 

    for i in xrange(2, n/2): 
     if n % i == 0: 
      return False 
    else: 
     return True 

def prime_numbers():  
    """Generator function which lazily 
    yields prime numbers one by one.""" 

    for i in count(1): 
     if is_prime(i): 
      yield i 

if __name__ == '__main__': 

    maxprime = int(raw_input("Enter a number:")) 

    for prime in prime_numbers(): 
     if prime < maxprime: 
      print prime 
     else: 
      break 
01 23,516,

파이썬 숙어 언어 기능들이 사용되었다 :

  • 발생기 기능 반복자 [1];
  • snake_case_method_naming [2];
  • docstrings [3];
  • if __name__ == '__main__': ... [4].

[1] http://www.ibm.com/developerworks/library/l-pycon/index.html

[2] PEP 8: Style Guide for Python Code

[3] http://www.learningpython.com/2010/01/08/introducing-docstrings/

[4] What does if __name__ == "__main__": do?


추신 젤리 빈과 rpInt는 답변과 코멘트에서 언급했듯이 일을 빠르게하는 여러 가지 방법이 있습니다. 그러나 당신은 "당신이 절대적으로 그렇게하지 않는 한"단순한 것이 복잡한 것보다 낫지는 않을 것입니다. [5].

[5] PEP 20: The Zen of Python

당신은 단지마다 2 수를 복용하고 그것에 의해 나누어 크게 기능을 향상시킬 수
0

. 먼저, 1은 소수가 아니므로이 방법으로 사용하면 안됩니다. 그 이유는 9 = 3 * 3과 같이 모든 수에 대해 고유 한 소수 분해입니다. 프라임 풀에 1을 더하는 경우, 9 = 3 * 3, 9 = 3 * 3 * 1, 9 = 3 * 3 * 1 * 1, 모든 것이 유효 프라임 인수이지만 더 이상 고유하지 않습니다. 모든 번호. 둘째, 모든 자연수로 번호를 확인할 필요가 없습니다. 자연수에 대해 생각해 보면 매초마다 짝수이고 2로 나눌 수 있습니다. 따라서 숫자가 4로 나눌 수있는 경우 정의에 따라 2로 나눌 수 있습니다. 계산에 필요한 양을 줄일 수 있습니다. 이 속성을 사용하는 경우 계수는 2입니다. 또한, "Erastothenes의 체"http://en.wikipedia.org/wiki/Sieve_of_Eratosthenes이라는 기술을 사용하여 소수에 소수점을 더한 다음 다음 자연수가 그 중 하나에 의해 나눌 수 있는지 확인합니다. 쉽게 악용 할 수 있습니다.

def buildPrimeList(): 
    #One is not really a prime, so we cut it out. 
    primeList = [2] 
    possiblePrime = 3 
    print "To display all prime values less than or equal a number..." 
    upperlimit = raw_input("Enter a number higher then 3 ") 
    try: 
     upperlimit = int(upperlimit) 
    except: 
     print "Sorry. You didn't enter a number." 
     return 
    while (possiblePrime <= upperlimit): 
     #lets check if the possible prime is divisable by any prime we already know. 
     isPrime = True 
     for prime in primeList: 
      if(possiblePrime % prime == 0): 
       #we can abort the check here, since we know already that this number can't be a prime 
       isPrime = False 
       break 

     if (isPrime): 
      primeList.append(possiblePrime) 

     possiblePrime = possiblePrime + 2 

    return primeList 


print buildPrimeList() 

예상대로 작동합니다.

관련 문제