2014-07-10 3 views
1

Project Euler 질문으로 돌아가서 코드 속도를 높일 수 있는지 알아 보려면 003 : 정말 큰 숫자의 최대 소수점 찾기.왜 이것이 소수의 소수를 통과하게합니까?

def is_prime(n): 
    '''check if n is prime''' 
    if n == 1: return 0 
    elif n == 2: return 1 
    elif n % 2 == 0: return 0 

    for i in range(3, int(n**0.5) +1, 2): 
     if n % i == 0: 
      return 0 
    else: 
     return 1 

factor_list = [] 
the_number = 600851475143 
for i in range(3, int(the_number**0.5) +1, 2): 
    if the_number % i == 0: factor_list.append(i) 

print factor_list 
for i in factor_list: 
    if is_prime(i) == False: factor_list.remove(i) 

print factor_list 
print max(factor_list) 

첫 번째 인쇄 호출 인쇄 : [71, 839, 1471, 6857, 59569, 104441, 486847] 지금까지 N의 사전 N^0.5 요인을 인쇄, 너무 좋아.

두 번째 인쇄 호출이 인쇄됩니다. [71, 839, 1471, 6857, 104441] 잠깐, 어떻게 104441이 is_prime 함수를 통과 했습니까?

세 번째 인쇄 호출은 잘못된 대답, 즉 104441을 인쇄합니다. 제 질문은 어떻게 104441이 미끄러 져 나오는지입니다.

+3

왜'is_prime'은'True' 또는'False' 대신'0' 또는'1'을 리턴합니까? 그러면 출력을'거짓 '과 비교하여 왜 검사하고 있습니까? – murgatroid99

+0

@murgatroid 0은 거짓이고 0이 아닌 값이 모두 참이면 동의어입니다. 사실 부울 값을 반환하는 연산은 0 또는 1을 반환합니다. 또한이 함수는 10441이 통과하지 못하게할지 여부에 영향을주지 않습니다. – mistersister

+0

0은 부울로 강제 변환 될 때를 제외하고는 거짓이 아닙니다. 그들은 평등하지 않습니다. 이것은 C가 아닙니다. 그리고 처음 질문을 읽을 때 문제가 될 것이라고 생각했습니다. – murgatroid99

답변

2

for 루프에 문제가 있다고 생각합니다. for-each 루프를 사용할 때 값을 건너 뛰기 때문에 일반적으로 값을 제거하지 않으려 고합니다. 그래서 무슨 일이 일어 났는지는 59569이 제거되고 그 다음 제거하기 때문에 다음 i 값은 486847입니다.

해결 방법을 원한다면 steveha의 코드를 참조하십시오.

+0

감사합니다. 귀하의 답변이 정확하다고 생각합니다. 나는 일하는 코드를 찾고있는 것이 아니라, 원래 코드가 왜 작동하지 않는지를 알고 싶었다. 좀 더 작고 실행 가능한 숫자를 밟아서 테스트를 해보겠습니다. 나는 그 대답을 확인할 것이라고 생각합니다. 다시 한 번 감사드립니다. – mistersister

+0

문제 없습니다. 다행히 도울 수있어. – Zhouster

2

반복하면서 목록을 수정하려고하면 항상 힘들습니다. 필요하지 않은 값을 추출하는 대신 필요한 목록을 만드는 것이 더 낫고 안전합니다.

이 코드

완벽하게 작동합니다 : 또한

factor_list = [n for n in xrange(3, int(the_number**0.5) +1, 2) if the_number % n == 0] 
print(factor_list) 

prime_factors = [n for n in factor_list if is_prime(n)] 
print(prime_factors) 

answer = max(prime_factors) 
print(answer) 

, 당신은 is_prime()하지 01에서 FalseTrue를 반환해야합니다.

+0

훌륭한 조언과 훌륭한 코드. 아직도 is_prime이 104441을 빠져 나가게하는 이유에 대해 내 머리를 감쌀 수 없습니다. 또한 1, 0 PEP-8 작풍 또는 개인적인 특혜에 진실한, 틀린 것, 그들은 동의어입니까? – mistersister

+0

'is_prime()'은 104441을 통과시키지 않습니다; 내 코드가 잘 작동합니다. 문제는 목록에서 *를 반복하면서 목록에서 값을 제거하는 루프가 올바르게 작동하지 않는다는 것입니다. 그것은 루프 문제입니다. 내 코드는 단지 원하는리스트를 만들고'is_prime()'이 작동하기 때문에 결과는 정확하다. 'True'와'False' 문제는 PEP 8에서 명시 적으로 밝혀진 것이 아니라 여러분이 의미하는 코드를 작성한 예일뿐입니다. 진실/거짓 상태를 실제로 평가하고 있습니다. 당신은 당신의 코드에서'False'와 비교할 수도 있습니다. 파이썬은 내장 된'True'와'False'를 제공하기 때문에 이것을 사용하십시오. 이것은 C가 아닙니다! :-) – steveha

+0

죄송합니다, 오해하셨습니까? 나는 왜 _my_ 코드를 빠져 나가고 있는지 언급했다. 코드는 내가 작성한 것보다 효율적이고 덜 어색합니다. 혼란을 드려 죄송합니다. 또한, 포인트는 참/거짓으로 적용되며 적용됩니다. 다시 한번 감사드립니다. – mistersister

관련 문제