我正在尝试解决关于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]) {
...
}
有人可以解释这两者是如何相同的吗?
答案 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,并且只选择j
可B[i]
分割时的行为(没有静止值)。通过让j
转到B[i] * 0, B[i] * 1, B[i] * 2.....N
,第二个表单会得到相同的结果。如果你考虑一下,只有B [i]的倍数可以被B [i]分割(没有静止值)。