繁体   English   中英

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

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

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

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM