2015-01-24 11 views
1

Я пытался решить головоломку A14, найденную по адресу http://chortle.ccsu.edu/CPuzzles/PartA/CpuzzlesAsection11.html, используя Java (с Eclipse), когда я наткнулся на некоторые неожиданные результаты.Вложенная петля дает неожиданные результаты

Головоломка требует, чтобы на каждой строке k печатались все целые числа, кратные 23 в диапазоне от 100 * k до 100 * k + 99 (где k - некоторый предел, такой как 11).

для цикла Уплотненного, что я в конечном счете используется для решения этой проблемы был:

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 * I + J перед использованием по модулю разделения в If Заявление и оно произвело только одну строку результатов: «0 23 46 69 92» (по сравнению с правильным решением, которое дало мне 11 строк результатов: «0 23 46 69 92» в первой строке », 115 138 161 184 «во второй строке и т. д.).

Я пытался выяснить причину этого. Даже без круглых скобок я бы предположил, что оператор If использовал модульное деление по j, прежде чем объединять его с 100 * i. Однако, если бы это было так, не выдавало бы 11 строк (если k = 11) из «0 23 46 69 92» вместо одной строки?

ответ

1

Это связано с приоритетом оператора. Оператор modulo (%) как более высокий приоритет над операторами плюс и минус. См. http://docs.oracle.com/javase/tutorial/java/nutsandbolts/operators.html.

Возьмите, например, случай, когда i = 1 и j = 38. В этом случае

(100 * i + j) % 23 оценивается в 0 и, следовательно, условие истинно. С другой стороны, 100 * i + j % 23 оценивает 115, а условие - false.

Причина, по которой печатается только одна строка при удалении круглых скобок, заключается в том, что при i > 0 (начиная со второй строки) выражение 100 * i + j % 23 всегда будет больше 100, и поэтому условие равного нулю всегда будет ложный. Поэтому ничто не будет напечатано, начиная со второй итерации внешнего цикла for.

+1

спасибо. В этом есть смысл. На первой итерации i = 0, что приводит к добавлению 100 * 0 к остальной части левой части реляционного оператора. Условие будет по-прежнему истинным, если j% 23 == 0. Во второй итерации i = 1, в результате чего добавляется 100 * 1. После первой итерации условие всегда будет ложным. – ricky085

0

Потому что, например, (100*1 + 15)%23 == 0, но 100*1 + 15%23 == 100*1 + (15%23) == 115.