d491: 我也愛偶數 (swap 版) (16)
更新時間:2016/12/20
內容:文文愛偶數,無獨有「偶」地,珊珊也愛偶數。珊珊除了收藏偶數以外,每次她收到一些數字時,她還會把其中的偶數挑出來把玩並予以加總。今天珊珊又收到了一個範圍的連續整數,請問這次她從這段數字中所收集到的偶數的總和是多少?
輸入說明:
輸入只有一行,其中含有兩個由空白隔開的整數 a, b (0 ≤ a, b ≤ 2147483647)。(a 不一定會小於等於 b 哦!)
輸出說明:
請輸出一個整數,代表 a 與 b 之間 (含 a 與 b) 所有偶數的和,(答案會 ≤ 2147483647)。
範例輸入:
5 2
範例輸出:
6
提示:
背景知識:
想一想,再看解答~
我的解題想法:
判斷是否 a>b ,如果是 交換兩數,使得拿到的數字永遠 a<=b 。如此,就可以利用 基本題型第八題 d490: 我也愛偶數(8),計算「連續偶數和」的方法!
♠使用判斷式 if-else
程式碼:
#include <stdio.h> int main(void){ int a,b; scanf("%d%d",&a,&b); if(a>b){ int tmp = a; a = b; b = tmp; } a = a + (a%2); b = b - (b%2); printf("%d", (int)((a*0.5 + b*0.5)*((b-a)*0.5 + 1))); return 0; }程式碼解析:
#1: | 引入標準輸入/輸出串流。 |
#2: | 主程式開始,回傳引數int,沒有參數。 |
#3: | 宣告2個整數(int)變數「a」、「b」,範圍–2,147,483,648 到 2,147,483,647。 |
#4: | 從標準輸入讀取格式化數據。讀取2個整數(%d%d),依序指定值給「a」、「b」。 |
#5: | 邏輯判斷式 if 開始。判斷是否 a>b。 |
#6: | 宣告1個暫存的整數(int)變數「tmp」,並指定值為 a。 |
#7: | 變數 a 指定值為 b。 |
#8: | 變數 b 指定值為 tmp。 |
#9: | 邏輯判斷式 if 結束。 |
#10: | 計算上底的偶數值並存回變數「a」。 |
#11: | 計算下底的偶數值並存回變數「b」。 |
#12: | 將格式化數據顯示到標準輸出。輸出1個整數(%d)「(int)((a*0.5+b*0.5) * ((b-a)*0.5 + 1))」。 ((a*0.5+b*0.5) * ((b-a)*0.5 + 1))數字前加上(int),表示將數字轉換成 int 整數型別。 |
#13: | 主程式回傳整數「0」。 |
#14: | 主程式結束。 |
進階想法:
如何不使用邏輯判斷式 if、switch、?:等......,就可以交換兩數?我們先觀察下方表格。
運算式 | 如果 a比b大 | 如果 a等於b | 如果 a比b小 |
---|---|---|---|
a>=b | true(1) | true(1) | false(0) |
a<b | false(0) | false(0) | true(1) |
a = (a>=b)*b + (a<b)*a;
b = (a>=b)*a + (a<b)*b;
但,如果連續執行兩個式子的話,a 與 b 將都得到最小值。所以我們還要用一個暫存變數來交換兩數。
int tmp = (a>=b)*b + (a<b)*a;
b = (a>=b)*a + (a<b)*b;
a = tmp;
♠使用「算數運算子」解題。
程式碼:
#include <stdio.h> int main(void){ int a,b,tmp; scanf("%d%d", &a, &b); tmp = (a>=b)*b + (a<b)*a; b = (a>=b)*a + (a<b)*b; a = tmp + (tmp%2); b = b - (b%2); printf("%d", (int)((a*0.5 + b*0.5)*((b-a)*0.5 + 1))); return 0; }程式碼解析:
#1: | 引入標準輸入/輸出串流。 |
#2: | 主程式開始,回傳引數int,沒有參數。 |
#3: | 宣告2個整數(int)變數「a」、「b」與 1個暫存整數變數「tmp」,範圍–2,147,483,648 到 2,147,483,647。 |
#4: | 從標準輸入讀取格式化數據。讀取2個整數(%d),依序指定值給「a」、「b」。 |
#5: | 將兩數中的最小值,存入變數「tmp」。 |
#6: | 將兩數中的最大值,存入變數「b」。 |
#7: | 計算上底的偶數值並存回變數「a」。 |
#8: | 計算下底的偶數值並存回變數「b」。 |
#9: | 將格式化數據顯示到標準輸出。輸出1個整數(%d)「(int)((a*0.5+b*0.5) * ((b-a)*0.5 + 1))」。 ((a*0.5+b*0.5) * ((b-a)*0.5 + 1))數字前加上(int),表示將數字轉換成 int 整數型別。 |
#10: | 主程式回傳整數「0」。 |
#11: | 主程式結束。 |