嵌套 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 = 1j = 38 的情况为例。在这种情况下,

(100 * i + j) % 23 的计算结果为零,因此条件为真。另一方面,100 * i + j % 23 的计算结果为 115,条件为假。

去掉括号只打印一行的原因是当i > 0(从第二行开始)时,表达式100 * i + j % 23总是大于100,因此等于零的条件永远为假。因此,从外部 for 循环的第二次迭代开始,不会打印任何内容。

因为,例如,(100*1 + 15)%23 == 0100*1 + 15%23 == 100*1 + (15%23) == 115.