2014-02-25 3 views
0

저는 파이썬에 익숙하지 않고 중첩 루프를 사용하여 50보다 작은 모든 소수를 인쇄해야하는이 코드에 몇 가지 문제가 있습니다.소수 파이썬 중첩 루프

i = 2 
while(i < 50): 
    j = 2 
    while(j <= (i/j)): 
      if not(i%j): 
       break 
      j = j + 1 
      if (j > i/j): 
       print(i, " is prime") 
    i = i + 1 

출력은 다음과 같습니다 : 여기

코드입니다

2 is prime 
3 is prime 
5 is prime 
7 is prime 
11 is prime 
13 is prime 
17 is prime 
19 is prime 
23 is prime 
29 is prime 
31 is prime 
37 is prime 
41 is prime 
43 is prime 
47 is prime 

그래서 3 후, j는 2이어야하며, 그 다음은 소수 아니라 내가 4.해야한다, 그래서 while 루프로 돌아갑니다.

그리고 프로세스가 다시 시작됩니다. j와 i는 하나씩 증가해야합니다. 그래서 j는 3이고 i는 5가되어야하고 5는 소수입니다. 그러면 다시 6으로 증가합니다.

그래서 j는 여전히 3이어야하며 6이어야합니다. 그러나 (3 < = (6/3)) < - 이것은 사실이 아니므로 if 문으로 가고 3은 j가 2보다 크다. i/j는 6이 소수임을 의미한다.

하지만 그렇지 않습니다. 당신은 상식으로 그것을 말할 수 있습니다. 그리고 나는 여기서 내가 잘못한 부분을 알고 싶다. 나는 여기에 어떤 증분도 놓쳤는가? 고맙습니다.

+0

로 받아 주시기 바랍니다, 그것은 완전히 명확하지 않다. 제발 좀 더 자세히 설명해주세요. – NPE

+0

네, 그 프로그램이 옳고 출력물이 정확하다는 것을 압니다. 그러나 나는 틀린 생각을하고 싶습니다 *. – James

+1

오, 알았어요. 내러티브를 다시 형식화하지 않는 이유는 다음과 같습니다. (1) 한 줄에 하나의 작업이 있습니다. (2) 각 줄은'i'와'j'의 결과 값이 무엇이라고 생각하는지 보여줍니다. 이것은 당신의 이야기를 많이 * 쉽게 따라 할 수 있습니다 (그리고 당신이 문제를 찾을 수 있도록 도와 줄 수도 있습니다). – NPE

답변

0

우선, 코드의 올바른 구문을 게시하고 싶습니다.

i = 2 
while(i < 50): 
     j = 2 
     while(j <= (i/j)): 
      if not(i%j): 
       break 
      j = j + 1 
      if (j > i/j): 
       print(i, " is prime") 
     i = i + 1 

이렇게 코드를 작성하면 몇 가지 작업을 수행 할 수 있습니다. 우리가 할 수있는 첫 번째 일은 어떤 것을 가정하는 대신에 무엇이 무엇인가에 대한 멋진 시각을 얻는 것입니다. 우리가 할 수있는 두 번째 일은 이 증가한 것을 볼 수 있습니다. 여기서.

이제이 코드의 내부에서 진행되는 작업에 대해 알아 보겠습니다. 가장 먼저 깨닫게되는 것은 우리가 i = 2로 시작한다는 것입니다. 그러면 우리는 50보다 클 때 멈출 것 인 while 루프를 초기화 할 것입니다.

이제 우리는 첫 번째 while 루프 안에 있고 다음으로는 j을 호출합니다. 이 변수는 2와 같습니다. 2와 같을뿐만 아니라 i> = 50 일 때 끝나는 루프의 처음으로 내려갈 때마다 처음으로 돌아가서 j를 다시 2로 다시 초기화합니다.

이것은 SECOND (NESTED) while 루프에서 j에 추가하더라도 j가 절대로 2로 시작하지 않는다는 것을 의미합니다.

귀하의 질문을 이해하면 여기에서 나온 모든 내용이 의미가 있습니다. 내 의견으로는,이 코드에 대한 이상한 유일한 것은입니다 :

if not (i%j) 

가 말했다 경우 더 사무 것을 위해 이것은 조금 이상한 것 같다

if (i%j == 0): 
     break 

을 당신이 어떤이있는 경우 다른 질문은 언제든지 물어보십시오. 당신이 뭔가 잘못이라고 생각하는 이유 당신이 도움을 찾을 수 있다면, 당신의 대답 : 프로그램이 올바른 출력을 생산 감안할

+0

그렇지 않은 경우 (i % j)는 i % j이 0 인 경우 그렇지 않은 경우 true (i % j)를 의미합니다. 이는 나머지를 갖지 않고 똑같이 나누어 졌음을 의미합니다. 글쎄, 나를 위해, 당신이 쓴 것은 조금 더 의미가 있지만, 둘 다 나와 잘 맞습니다. 이해 했어요. 그리고 고마워, 내가 잘못 생각한 것을 알아 냈어. – James

0

들여 쓰기 된 코드는 다음과 같습니다. 코드에서

i = 2 
while(i < 50): 
    j = 2 
    while(j <= (i/j)): 
     if not(i%j): 
      break 
     j = j + 1 
    if (j > i/j) : 
     print(i, " is prime") 
    i = i + 1 

ji의 모든 증가로 2 초기화지고있다. 어떤 ji을 분할하는 경우
if not(i%j)true 및 루프 휴식을하게하지만 j <= (i/j)은 여전히 ​​다른 컨트롤이 루프를 입력하지 않았을 보유하고,이 조각을 if not(i%j): break
를 참조하십시오. 따라서 제어 건너 뛰기 print(i, " is prime")

따라서 if(j > i/j)true이되는 유일한 방법은 위의 루프가 중단되지 않는 경우입니다. 즉, i은 제수가 없으므로 i이 소수입니다.

+0

감사합니다. – James