前往
大廳
主題

ZeroJudge - d485: 我愛偶數 解題心得

Not In My Back Yard | 2021-08-29 00:00:14 | 巴幣 0 | 人氣 400

題目連結:


題目大意:
輸入給定兩非負整數 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)




此次分享到此為止,如有任何更加簡潔的想法或是有說明不清楚之地方,也煩請各位大大撥冗討論。

創作回應

更多創作