若您覺得文章寫得不錯,請點選文章上的廣告,來支持小編,謝謝。
If you like this post, please click the ads on the blog or buy me a coffee. Thank you very much.
題目說明:文文很喜歡偶數,他甚至有收集偶數的習慣。你給他一個範圍的連續整數,他就會把其中的偶數留下來收藏。如今他又拿到了一個範圍的整數,請問他這次收藏了幾個偶數?對文文來說,0 也算是一個偶數哦!
輸入
輸入只有一行,其中含有兩個由空白隔開的整數 a, b (0 ≤ a ≤ b ≤ 2147483647)。
輸出
輸出一個整數,代表 a 與 b 之間 (含 a 與 b) 一共有多少個偶數。
解題說明
解題方法一:暴力法(效率不好)
用一個變數even來記錄有幾個偶數。
使用迴圈對a與b之間的數做是不是偶數判斷。
C++ 程式碼
- #include<iostream>
- using namespace std;
- int main(void) {
- int a, b, even = 0;
- cin >> a >> b;
- for(int i = a; i <= b; i++)
- if( (i & 1) == 0) even++;
- cout << even << endl;
- }
解題方法二:數學分析法
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++ 程式碼
- #include<iostream>
- using namespace std;
- int main(void) {
- int a, b;
- cin >> a >> b;
- int cnt = (b - (b&1) - a - (a&1)) / 2 + 1;
- cout << cnt << endl;
- }
沒有留言:
張貼留言