2015-02-07 212 views
-3

我試圖解決hackerrank上的一個難題(夏洛克和查詢之謎 - https://www.hackerrank.com/challenges/sherlock-and-queries)。工作了一段時間後,我開始在互聯網上尋找一些幫助。我在這裏找到一個帖子https://codereview.stackexchange.com/questions/58095/sherlock-and-queries-challenge?newreg=0bf47176275d428dbdfa0c6a4bc86f07,讓我困惑。看起來好像他改變了這一'For'循環後跟'if'語句變成'for'循環

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

這個

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

有人能請解釋一下這兩個怎麼是等價的?

回答

0

假設B[i]是整數> = 2時,兩個片段將相當於僅當第二個將是:

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

} 

因此j將隨着遍歷所有被B[i]整除的值,這是完全第一個循環中的條件爲真的j的值。

如果j初始化爲B[i]-1,j%B[i]永遠不是0,所以第二個循環不等於第一個循環。

0

兩者不相等。

爲第一種形式的右等效來接近所述第二形式是:

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

第一形式允許j從0到N和只選擇行動時j是可分割由B[i](沒有休息價值)。第二種形式得到相同的結果,讓jB[i] * 0, B[i] * 1, B[i] * 2.....N。如果你考慮一下,只有B [i]的倍數可以被B [i]分割(沒有剩餘值)。