2015年5月22日 星期五

d490:我也愛偶數(8)

d490: 我也愛偶數(8)

更新時間:2016/12/20
內容
  文文愛偶數,無獨有「偶」地,珊珊也愛偶數。珊珊除了收藏偶數以外,每次她收到一些數字時,她還會把其中的偶數挑出來把玩並予以加總。今天珊珊又收到了一個範圍的連續整數,請問這次她從這段數字中所收集到的偶數的總和是多少?
輸入說明
  輸入只有一行,其中含有兩個由空白隔開的整數 a, b (0 ≤ a ≤ b ≤ 2147483647)。
輸出說明
  請輸出一個整數,代表 a 與 b 之間 (含 a 與 b) 所有偶數的和,(答案會 ≤ 2147483647)。
範例輸入
  2 5
範例輸出
  6
提示



想一想,再看解答~


我的解題想法:
  可以使用梯形公式(上底+下底)*高*0.5;但怕會溢位,故改成(上底*0.5 + 下底*0.5)*高。
    確認 a 是否為偶數,不是的話必須+1,故 上底 = a + (a%2)。
    確認 b 是否為偶數,不是的話必須-1,故 下底 = b - (b%2)。
    上底、下底都是偶數,公差為2,故 高 = ((下底 - 上底)*0.5) + 1



程式碼
#include <stdio.h>
int main(void){
    int a,b;
    scanf("%d%d",&a,&b);
    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:計算上底並存回變數「a」。
#6:計算下底並存回變數「b」。
#7:將格式化數據顯示到標準輸出。輸出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 整數型別。
#8:主程式回傳整數「0」。
#9:主程式結束。