題目連結:
題目大意:
輸入給定兩非負整數 a 、 b(0 ≦ a ≦ b ≦ 2147483647),試問在不用 if 指令的情況下求出 a(含)~ b(含)有多少偶數?
範例輸入:
1 4
範例輸出:
2
解題思維:
假設我們已經知道了 E(i) = 0(含)~ i(含)之間有多少偶數。因此 a ~ b 之間的偶數即為
E(b) - E(a - 1)
個。
可以看到 E(i) = floor(i ÷ 2) + 1,其中 floor 為下高斯函數。
不過因為 a - 1 之值有可能會是 -1(也就是 a = 0 時),所以套進 E(i) 時原先的定義範圍會略顯奇怪(即 0 ~ -1)。
觀察 a > 0 時的情況,我們可以看到所求為
(floor(b ÷ 2) + 1) - (floor((a - 1) ÷ 2) + 1)
等價於
floor(b ÷ 2) - floor((a - 1) ÷ 2)
而 a = 0 時,所求恰好是 E(b),即
floor(b ÷ 2) + 1
而此時可以看到剛好上式會等價於
floor(b ÷ 2) - floor((a - 1) ÷ 2)
因為此時 floor((a - 1) ÷ 2) = -1 而 -(-1) = 1。
因此我們可以將原先的式子改寫成
floor(b ÷ 2) - floor((a - 1) ÷ 2)
便可以不使用 if(或是任何條件運算子)而求得所求。
而對於整數 i 來說,floor(i ÷ 2) 可以用位元運算替換,即 (i >> 1)。因此所求為
(b >> 1) - ((a - 1) >> 1)
此次分享到此為止,如有任何更加簡潔的想法或是有說明不清楚之地方,也煩請各位大大撥冗討論。