嵌套 for 循环给出意想不到的结果
Nested for loop gives unexpected results
我试图使用 Java(使用 Eclipse)解决在 http://chortle.ccsu.edu/CPuzzles/PartA/CpuzzlesAsection11.html 找到的谜题 A14,但遇到了一些意想不到的结果。
这个谜题要求在每一行 k 上打印 100 * k 到 100 * k + 99(其中 k 是某个极限,例如 11)范围内的所有 23 的倍数的整数。
我最终用来解决问题的嵌套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
,条件为假。
去掉括号只打印一行的原因是当i > 0
(从第二行开始)时,表达式100 * i + j % 23
总是大于100,因此等于零的条件永远为假。因此,从外部 for
循环的第二次迭代开始,不会打印任何内容。
因为,例如,(100*1 + 15)%23 == 0
但 100*1 + 15%23 == 100*1 + (15%23) == 115
.
我试图使用 Java(使用 Eclipse)解决在 http://chortle.ccsu.edu/CPuzzles/PartA/CpuzzlesAsection11.html 找到的谜题 A14,但遇到了一些意想不到的结果。
这个谜题要求在每一行 k 上打印 100 * k 到 100 * k + 99(其中 k 是某个极限,例如 11)范围内的所有 23 的倍数的整数。
我最终用来解决问题的嵌套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
,条件为假。
去掉括号只打印一行的原因是当i > 0
(从第二行开始)时,表达式100 * i + j % 23
总是大于100,因此等于零的条件永远为假。因此,从外部 for
循环的第二次迭代开始,不会打印任何内容。
因为,例如,(100*1 + 15)%23 == 0
但 100*1 + 15%23 == 100*1 + (15%23) == 115
.