Test Message

d485: 我愛偶數

內容

文文很喜歡偶數,他甚至有收集偶數的習慣。你給他一個範圍的連續整數,他就會把其中的偶數留下來收藏。如今他又拿到了一個範圍的整數,請問他這次收藏了幾個偶數?對文文來說,0 也算是一個偶數哦!


輸入

輸入只有一行,其中含有兩個由空白隔開的整數 a, b (0 ≤ a ≤ b ≤ 2147483647)。

1 4

輸出

輸出一個整數,代表 a 與 b 之間 (含 a 與 b) 一共有多少個偶數。

2

提示

你可以只用算術運算子,而不用 if 指令來完成這題嗎?


解題思路

  1. 先不考慮首末兩項,中間項目總數 = (max - min) + 1
  2. 而如果末項為奇數,那 ((max - 1) - min) + 1 和 (max - min) + 1 的總偶數項不會變,同理套用到首項。
  3. 偶數的出現頻率為每兩項出現一次,所以假設首末兩項皆為偶數,那偶數出現的總次數 = Floor((max - min) / 2) + 1,
  4. 任何整數和位元 AND('&')做運算,若該數為偶數則值恆為 0 ,反之則為 1 。

運用上面的想法,整理出公式

偶數次數 = (max - (max & 1) - (min + (min & 1))) / 2 + 1
= (max - min - (max & 1) - (min & 1)) / 2 + 1

將輸入套入公式輸出即可。


完整程式碼

AC (2ms, 104KB)
#include <stdio.h>

int main()
{
int n, m;
scanf(" %d %d", &n, &m);
printf("%d\n", (m - n - (m & 1) - (n & 1)) / 2 + 1);
return 0;
}