Java ';对于';循环后跟一个';如果';语句转换为';对于';环

Java ';对于';循环后跟一个';如果';语句转换为';对于';环,java,if-statement,for-loop,modulo,Java,If Statement,For Loop,Modulo,我正在尝试解决一个关于hackerrank的谜题(夏洛克和查询谜题-)。在做了一段时间之后,我开始在互联网上寻找帮助。我在这里发现了一个让我困惑的帖子。看起来他好像改变了这个 for (int j = 0; j < N; ++j) { if (j % B[i] == 0) ... } for(int j=0;j

我正在尝试解决一个关于hackerrank的谜题(夏洛克和查询谜题-)。在做了一段时间之后,我开始在互联网上寻找帮助。我在这里发现了一个让我困惑的帖子。看起来他好像改变了这个

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

for (int j = B[i] - 1; j < N; j += B[i]) {
     ...
}
(int j=B[i]-1;j
有人能解释一下这两个片段是如何等价的吗?

假设
B[i]
是一个整数>=2,那么只有当第二个片段是:

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

}
(int j=0;j 因此,
j
将迭代可被
B[i]
整除的所有值,这些值正是第一个循环中条件为真的
j
的值

如果
j
被初始化为
B[i]-1
j%B[i]
从不为0,因此第二个循环与第一个循环不相等。

两者不相等

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

for (int j = 0; j < N; j += B[i]) {
     ...
}
(int j=0;j 第一种形式允许
j
从0变为N,并且仅当
j
可被
B[i]
除时(无剩余值)选择执行操作。第二种形式得到相同的结果,让
j
转到
B[i]*0,B[i]*1,B[i]*2…..N
。仔细想想,只有B[i]的倍数可以除以B[i](没有剩余值)