当我遇到一些意想不到的结果时,我试图使用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;而不只是一行?
答案 0 :(得分:1)
这是由于运营商的优先级。模(%
)运算符优先于正和负运算符。请参阅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
循环的第二次迭代开始,不会打印任何内容。
答案 1 :(得分:0)
例如,(100*1 + 15)%23 == 0
但100*1 + 15%23 == 100*1 + (15%23) == 115
。