2015-01-24 8 views
1

예기치 않은 결과가 발생할 때에서 발견 된 퍼즐 A14를 Java (Eclipse 포함)를 사용하여 해결하려고했습니다.중첩 된 for 루프가 예기치 않은 결과를 나타냅니다.

퍼즐을 사용하려면 각 줄 k에 100 * k에서 100 * k + 99까지의 범위에 23의 배수가되는 모든 정수를 인쇄해야합니다 (k는 일부 제한이 있습니다. 예 : 11). 나는 결국 문제를 해결하는 데 사용

중첩 된 For 루프했다 : 내가 만약에 모듈 사업부를 사용하기 전에 J를 + *

for(i = 0; i <= k; i++){ 
     for(j = 0; j <= 99; j++){ 
      if((100 * i + j) % 23 == 0) 
       System.out.print(100 * i + j + " "); 
     } 

     System.out.println(); 
    } 

하지만, 내 첫 번째 시도에서, 나는 100 괄호를 넣어하지 않았다 성명서는 "0 23 46 69 92"(올바른 해결책과 비교하여 11 줄의 결과를 얻었습니다 : "0 23 46 69 92"첫 줄에 "115 138 161 184 "두 번째 줄 등).

나는이 사실을 알기 위해 노력했다. 괄호가 없어도 If 문이 100 * i와 결합되기 전에 If 문이 j에 모듈 분할을 사용한다고 가정합니다. 그러나 그런 경우라면, 단 한 줄 대신에 "0 23 46 69 92"의 11 줄 (k = 11 인 경우)을 생산하지 않을까요?

답변

1

이것은 운영자 우선 순위 때문입니다. 모듈러스 (%) 연산자는 더하기 및 빼기 연산자보다 우선 순위가 높습니다. http://docs.oracle.com/javase/tutorial/java/nutsandbolts/operators.html을 참조하십시오.

예를 들면, i = 1j = 38을 취한다. 이 경우,

(100 * i + j) % 23은 0으로 평가되므로 조건은 참입니다. 한편, 100 * i + j % 23115으로 평가되고 조건은 거짓입니다.

괄호를 제거 할 때 한 줄만 인쇄되는 이유는 두 번째 줄에서 시작하여 i > 0 일 때 100 * i + j % 23이라는 표현식은 항상 100보다 커야하므로 0 인 조건은 항상 0이됩니다. 그릇된. 따라서 외부 for 루프의 두 번째 반복에서 인쇄가 시작됩니다.

+1

감사합니다. 그건 의미가 있습니다. 첫 번째 반복에서 i = 0으로 설정하여 관계 연산자의 왼쪽 나머지 부분에 100 * 0을 더합니다. j % 23 == 0이면 조건은 계속 true입니다. 두 번째 반복에서 i = 1이되어 100 * 1이 추가됩니다. 첫 번째 반복 후 조건은 항상 거짓입니다. – ricky085

0

예를 들어, (100*1 + 15)%23 == 0이지만 100*1 + 15%23 == 100*1 + (15%23) == 115입니다.