我正在尝试解决在 http://chortle.ccsu.edu/CPuzzles/PartA/CpuzzlesAsection11.html 中找到的 A14 谜题。 ,使用 Java(与 Eclipse),当我遇到一些意想不到的结果时。
该谜题要求在每一行 k 上打印 100 * k 到 100 * k + 99 范围内所有 23 的倍数的整数(其中 k 是某个限制,例如 11)。
我最终用来解决问题的嵌套For循环是:
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 语句在 j 上使用模除法,然后将其与 100 * i 组合。然而,如果是这样的话,它不是会产生 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
并且条件为 false。
去掉括号后只打印一行的原因是,当i > 0
(从第二行开始)时,表达式100 * i + j % 23
将始终大于100,因此等于0的条件始终为假。因此,从外部 for
循环的第二次迭代开始,不会打印任何内容。
关于java - 嵌套 for 循环给出意想不到的结果,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28124079/