文文愛偶數,無獨有「偶」地,珊珊也愛偶數。珊珊除了收藏偶數以外,每次她收到一些數字時,她還會把其中的偶數挑出來把玩並予以加總。今天珊珊又收到了一個範圍的連續整數,請問這次她從這段數字中所收集到的偶數的總和是多少?
輸入說明 :
輸入只有一行,其中含有兩個由空白隔開的整數 a, b (0 ≤ a, b ≤ 2147483647)。(a 不一定會小於等於 b 哦!)
輸出說明 :
請輸出一個整數,代表 a 與 b 之間 (含 a 與 b) 所有偶數的和,(答案會 ≤ 2147483647)。
範例輸入 :
5 2
範例輸出 :
6
程式碼 :
#include <stdio.h> int main() { long long a,b; while(scanf("%lld%lld",&a,&b)==2) { if(a > b) a^=b^=a^=b; if(a%2==1) a++; if(b%2==1) b--; printf("%lld\n",(a+b)*(b-a+2)>>2); } return 0; }
http://zerojudge.tw/ShowProblem?problemid=d491
可以麻煩解釋一下這題的程式碼嗎?
回覆刪除以我的智力有點難以理解。
謝謝~
喔!原來這個程式我寫的這麼爛 ==(把簡單的程式寫的這麼複雜)
回覆刪除1.a^=b^=a^=b; <= a,b交換的效果,想知道原理你可以參考這篇的留言 http://ghaouse.blogspot.com/2011/08/d507.html
2.第10~13行:把範圍變成偶數,例如今天要求1~101,其實就等於算2~100,1和101都捨去不要,說的簡單一點就是把最前面和最後面的值都變成偶數,這是為了讓我後面的公式好計算。
3.第14行:用梯形公式算總和,(上底+下底)*高/2,其中>>2的意思是和/4是一樣的,>>是shift right bit。
如果有地方沒有說清楚,可以在和我說一下
哇!原來交換變數還有這種驚人的寫法,
回覆刪除本來我是不太理解為什麼一個分號的程式碼能夠變成三個分號的程式碼,
但是看過那邊以後就明白了~"~
只剩下一個問題,為什麼是從右至左拆解?
這是c語言的規則,我也沒辦法和你解釋,只能看到後記起來...
回覆刪除下面有一個參考網址 ms1.hcvs.kh.edu.tw/hc3331/tc/ch03.doc
打開後搜尋"^="看結合率就知道了
你給我的文件檔案好詳盡喔~
回覆刪除請問還有別的章節嗎?
感恩~
檔案名稱有規律,自己下載吧!
回覆刪除ms1.hcvs.kh.edu.tw/hc3331/tc/ch01.doc
.
.
.
ms1.hcvs.kh.edu.tw/hc3331/tc/ch06.doc