2015年6月6日 星期六

d491:我也愛偶數 (swap 版) (16)

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>=btrue(1)true(1)false(0)
a<bfalse(0)false(0)true(1)
現在我們想要得到 a<=b 的結果,利用上面這張表格,我們可以得到下列的式子:
   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:主程式結束。