高中生程式解題系統:d485: 我愛偶數

 若您覺得文章寫得不錯,請點選文章上的廣告,來支持小編,謝謝。

If you like this post, please click the ads on the blog or buy me a coffee. Thank you very much.

題目連結 https://zerojudge.tw/ShowProblem?problemid=d485

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

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

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


解題說明
解題方法一:暴力法(效率不好)
用一個變數even來記錄有幾個偶數。
使用迴圈對a與b之間的數做是不是偶數判斷。

C++ 程式碼
  1. #include<iostream>
  2. using namespace std;
  3.  
  4. int main(void) {
  5.   int a, b, even = 0;
  6.   cin >> a >> b;
  7.  
  8.   for(int i = a; i <= b; i++)
  9.     if( (& 1) == 0) even++;
  10.  
  11.   cout << even << endl;
  12. }

解題方法二:數學分析法
a與b有四種狀況
1. a 為奇數,b 為奇數
例如 a = 1,b = 3 時,偶數總共有 (b - a) / 2 = (3 - 1)/2 = 1。

2. a 為奇數,b 為偶數
例如 a = 1,b = 4 時,偶數總共有 (b - a) / 2 + 1 = (4 - 1)/2 + 1 = 1 + 1 = 2。

3. a 為數,b 為奇數
例如 a = 0,b = 7 時,偶數總共有 (b - a) / 2  + 1 = (7 - 0)/2 + 1 = 3 + 1 = 4。

4. a 為數,b 
例如 a = 0,b = 8 時,偶數總共有 (b - a) / 2  + 1 = (8 - 0)/2 + 1 = 4 + 1 = 5。

可將任意整數用位元運算AND( & ) 與數字 1 做運算。
n是奇數,則 n & 1 結果為 1。
n是偶數,則 n & 1 結果為 0。

因此a 為奇數,b 為奇數時,可以用 (b - (b&1) - a - (a&1)) / 2 + 1 來算出有幾個偶數。此式子在其他a與b三種狀況也適用。

C++ 程式碼
  1. #include<iostream>
  2. using namespace std;
  3.  
  4. int main(void) {
  5.   int a, b;
  6.   cin >> a >> b;
  7.   int cnt = (- (b&1) - a - (a&1)) / 2 + 1;
  8.   cout << cnt << endl;
  9. }

沒有留言: