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: | 主程式結束。 |