2013-09-05 3 views
0

이 코드에서 몇 가지 오답이 나타납니다. 예를 들어 9가 소수로 표시됩니다. 내 문제는 휴식을 사용하는 것 같아요,하지만 논리적 으로이 간단한 코드 누군가가 나에게 물어 무엇인지 알아낼 수 없습니다.파이썬, 소수에 대한 잘못된 답을 얻으 셨습니다

for number in range(0, 1000): 

    for x in range(2, number): 
     if (number % x == 0): 
      break 
     else: 
      print x 
      break 
+0

가능한 중복 [다른 코드 아래에 들여 쓰기 안 (http://stackoverflow.com/questions/12194947/을 찾으려는 범위까지 번호입니다 shouldnt-else-be-indentented-below-code) –

답변

4

스크립트에서 숫자가 2로 나눌 수 있는지 여부에 관계없이 즉시 루프를 중단합니다. 코드를 다시 잠궈 봤는데 이것은 아마도 당신이하려고했던 것과 더 가깝습니다. 수 가 다음 루프를 중단하고 나눌 수없는 경우 당신은 또한 루프. 그래서 모든 홀수, 같은 휴식의 range(2,number) 2 (첫 번째 숫자로 나눌 경우 원래 코드에서

, 9, 소수처럼 보였다.

for 루프 후 else 키워드 IFF에 를 실행

일반적으로 루프가 종료됩니다. 그래서 더 제수가 발견되지 않을 경우 부분 만 인쇄됩니다 "소수".

for number in range(0,1000): 
    for x in range(2,number): 
     if(number % x == 0): 
      print number,"divisible by",x 
      break 
    else: 
     print number, "is prime" 

당신이 여기 anction입니다 볼 수 있습니다 http://codepad.org/XdS413LR

는 또한,이 순진 알고리즘 (안 코드에 대한 비판, 간단한 알고리즘을 탐구하는 유용한 연구이다),하지만 당신은 좀 더 효율적으로 만들 수 있습니다. 기술적으로는 sqare root number까지만 확인하면됩니다. 제곱근보다 큰 숫자는 이미 만나야하는 제곱근보다 작은 보완수를 가져야합니다. 당신은 검사 또는 당신이 기회를 얻을 경우 조사 가치가있는 소수의 발견을 최적화 할 수있는 많은 방법이 말했다

from math import sqrt 
for number in range(0,1000): 
    for x in range(2,int(sqrt(number/2))): 
     # Rest of code as above. 

: 그래서 코드의 논리를 변경할 수 있습니다.

+2

+1 for/else의 적절한 사용 – Brian

+1

@Brian Answer 조기에 편집하고 자주 편집하십시오! –

+1

빠른 답변을 주셔서 감사합니다. 또한 이전 코드에 정확히 무엇이 잘못되었는지에 대한 철저한 설명을 주셔서 감사합니다. 코드를보다 효율적으로 만드는 방법이기도합니다. – trueCamelType

1

난 당신이 뭔가 싶은 생각 : 어떤 수가 1 이외의 어떤 #로 나누어 경우 모든 숫자 양식 1-100 및 검사를 통해

for number in xrange(100): 
    for i in range(2,number): 
     if number % i == 0: 
      break 
    else: 
     print number 

이 반복을하지만 당신은 측면을 else: 문을 필요 inner for loop 그래서 제수를 찾지 않고 내부 for 루프를 통과한다면

1

다음은 몇 가지 대안입니다. 이 약간 빠른

def check_for_prime(n): 
if n == 1: return False 
elif n == 2: return True 
elif n%2 == 0: return False 

# Elementary prime test borrowed from oeis.org/A000040. 
odds = 3 
while odds < n**.5+1: 
    if n%odds == 0: return False 
    odds += 2 
return True 

,하지만 당신은 수율을 사용 경험이 있어야합니다 : 첫째,이 소수를 확인

여기
def primes_plus(): 
yield 2 
yield 3 
i = 5 
while True: 
    yield i 
    if i % 6 == 1: 
     i += 2 
    i += 2 
1

몇 가지 대안입니다.

N 당신의

n=100 
for i in range(0,n): 
    num = filter(lambda y :i % y == 0,(y for y in range(2,(i/2)))) 
    if num or i == 4: 
     print "%s not a prime number" %(i) 
    else: 
     print "%s is a prime number" %(i) 
관련 문제