嵌套for循环会产生意外结果

时间:2015-01-24 09:31:52

标签: java eclipse for-loop nested-loops operator-precedence

当我遇到一些意想不到的结果时,我试图使用Java(使用Eclipse)解决在http://chortle.ccsu.edu/CPuzzles/PartA/CpuzzlesAsection11.html找到的Puzzle A14。

这个谜题要求在每一行k上打印在100 * k到100 * k + 99范围内的23的倍数的所有整数(其中k是某个极限,例如11)。

我最终用来解决问题的Nested 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附近,并且它只产生一行结果:&#34; 0 23 46 69 92&#34; (与正确的解决方案相比,它给了我11行结果:&#34; 0 23 46 69 92&#34;在第一行,&#34; 115 138 161 184&#34;在第二行,等等)。

我试图弄清楚这背后的原因。即使没有括号,我也会假设If语句在j上使用模块化除法,然后将其与100 * i组合。但是,如果是这种情况,则不会产生11行(如果k = 11)&#34; 0 23 46 69 92&#34;而不只是一行?

2 个答案:

答案 0 :(得分:1)

这是由于运营商的优先级。模(%)运算符优先于正和负运算符。请参阅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循环的第二次迭代开始,不会打印任何内容。

答案 1 :(得分:0)

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