這次的題目是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

  1. #include <iostream>  
  2. #include <iomanip>  
  3. using namespace std;  
  4. double f(double a);  
  5. int main()  
  6. {  
  7.     double input;  
  8.     cin>>input;  
  9.     cout<<fixed<<setprecision(2)<<((input+f(input))*1000+0.5)/1000<<endl;  
  10. }  
  11. double f(double a)  
  12. {  
  13.     if(a/2<1)  
  14.         return 0;  
  15.     else  
  16.         return a+f(a/2);  
  17. }  

C++用輸出控制到小數第二位的話,不知道為甚麼會五捨六入,第三位之後才會四捨五入,所以萬全的解決辦法

就是自己寫四捨五入,如果第二位則是x1000之後,+0.5再/1000,要第三位則是x10000,依此類推

那這題就解決了

若想閱讀相關文章請關注我的粉絲團

小資菜鳥向前衝

https://www.facebook.com/%E5%B0%8F%E8%B3%87%E8%8F%9C%E9%B3%A5%E5%90%91%E5%89%8D%E8%A1%9D-204484273323335/?fref=ts

文章標籤
創作者介紹

cychss6305的部落格

cychss6305 發表在 痞客邦 PIXNET 留言(0) 人氣()