這次的題目是http://e-tutor.itsa.org.tw/e-Tutor/mod/programming/view.php?id=8254
[C_RU08-易] 彈力球
問題描述
有一顆彈力球從高空掉落,每次彈起的高度是原高度的 1/2 ,請寫一程式計算直到球停止彈跳時,彈力球所經過的路徑 ( 彈起高度 <1 時以 0 計算 ) 。
※假設彈力球彈跳方式都是垂直的上下彈跳的。
輸入說明
輸入變數 N 代表起始高度
輸出說明
輸出總位移 ( 四捨五入輸出到小數第二位 ) 。
範例
Sample Input |
Sample Output |
10.5 20 27 |
28.88 57.50 77.63 |
這題是遞迴練習,只要掌握好規則就沒什麼困難,舉例
當球從10.5的地方掉落,那麼彈起的高度就是10.5/2=5.25
再從5.25掉落,這時球已經走了10.5(一開始掉落)+5.25(第一次彈起)+5.25(第二次掉落)=10.5+10.5=21.0
之後彈起是5.25/2=2.625,再掉落,則球走了
10.5(一開始掉落)+5.25(第一次彈起)+5.25(第二次掉落)+2.625(第二次彈起)+2.625(第三次掉落)=10.5+10.5+5.25=26.25
再彈起是2.625/2=1.3125,再掉落,走了
10.5(一開始掉落)+5.25(第一次彈起)+5.25(第二次掉落)+2.625(第二次彈起)+2.625(第三次掉落)+1.3125(第三次彈起)+
1.3125(第四次掉落)=10.5+10.5+5.25+2.625=28.875
之後要彈起的高度是1.3125/2=0.65625,但已經小於1,所以以0計
那麼球總共所走的就是28.875,而四捨五入到第二位就是28.88
- #include <iostream>
- #include <iomanip>
- using namespace std;
- double f(double a);
- int main()
- {
- double input;
- cin>>input;
- cout<<fixed<<setprecision(2)<<((input+f(input))*1000+0.5)/1000<<endl;
- }
- double f(double a)
- {
- if(a/2<1)
- return 0;
- else
- return a+f(a/2);
- }
C++用輸出控制到小數第二位的話,不知道為甚麼會五捨六入,第三位之後才會四捨五入,所以萬全的解決辦法
就是自己寫四捨五入,如果第二位則是x1000之後,+0.5再/1000,要第三位則是x10000,依此類推
那這題就解決了
若想閱讀相關文章請關注我的粉絲團
小資菜鳥向前衝
留言列表