[英]Nested for loop gives unexpected results
当我遇到一些意外的结果时,我正在尝试使用Java(使用Eclipse)解决http://chortle.ccsu.edu/CPuzzles/PartA/CpuzzlesAsection11.html上找到的Puzzle A14。
这个难题要求在每行k上打印所有23的整数,范围是100 * k到100 * k + 99(其中k是某个限制,例如11)。
我最终用来解决该问题的Nested For Loop是:
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();
}
但是,在我的第一次尝试中,在If语句中使用模除之前,我没有在100 * i + j周围加上括号,并且只产生了一行结果:“ 0 23 46 69 92”(与正确的解决方案相比,得出11行结果:第一行为“ 0 23 46 69 92”,第二行为“ 115 138 161 184”,依此类推)。
我试图找出背后的原因。 即使没有括号,我也会假设If语句在与100 * i组合之前在j上使用模块化除法。 但是,如果是这样的话,会不会产生11行(如果k = 11)“ 0 23 46 69 92”而不是仅仅一行?
这是由于运算符的优先级。 模( %
)运算符的优先级高于加号和减号运算符。 参见http://docs.oracle.com/javase/tutorial/java/nutsandbolts/operators.html 。
以i = 1
和j = 38
的情况为例。 在这种情况下,
(100 * i + j) % 23
计算为零,因此条件为真。 另一方面, 100 * i + j % 23
为115
,条件为假。
删除括号时只打印一行的原因是,当i > 0
(从第二行开始)时,表达式100 * i + j % 23
始终大于100,因此等于零将始终为假。 因此,从外部for
循环的第二次迭代开始不会打印任何内容。
因为例如(100*1 + 15)%23 == 0
但100*1 + 15%23 == 100*1 + (15%23) == 115
。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.