'for循环后跟'if'语句进入'for'循环

时间:2015-02-07 05:45:50

标签: java if-statement for-loop modulo

我正在尝试解决关于hackerrank的谜题(Sherlock和Queries谜题 - https://www.hackerrank.com/challenges/sherlock-and-queries)。在研究了一段时间后,我开始在互联网上寻找帮助。我发现这里的一篇帖子https://codereview.stackexchange.com/questions/58095/sherlock-and-queries-challenge?newreg=0bf47176275d428dbdfa0c6a4bc86f07让我很困惑。看起来好像他改变了这个

for (int j = 0; j < N; ++j) {
     if (j % B[i] == 0)
       ...
}

进入这个

for (int j = B[i] - 1; j < N; j += B[i]) {
     ...
}

有人可以解释这两者是如何相同的吗?

2 个答案:

答案 0 :(得分:0)

假设B[i]是一个整数&gt; = 2,只有当第二个片段是:

时,这两个片段才是等效的
for (int j = 0; j < N; j += B[i]) {

}

因此j会迭代所有可被B[i]整除的值,这些值恰好是j的值,第一个循环中的条件为真。

如果j初始化为B[i]-1,则j%B[i]永远不会为0,因此第二个循环不等同于第一个循环。

答案 1 :(得分:0)

两者不相等。

接近第二种形式的第一种形式的正确等价物是:

for (int j = 0; j < N; j += B[i]) {
     ...
}

第一个表单允许j从0变为N,并且只选择jB[i]分割时的行为(没有静止值)。通过让j转到B[i] * 0, B[i] * 1, B[i] * 2.....N,第二个表单会得到相同的结果。如果你考虑一下,只有B [i]的倍数可以被B [i]分割(没有静止值)。