题目的主要信息:
- 一球从h米高度自由落下,每次落地后反跳回原高度的一半再落下,求它在第n次落地时共经过了多少米?第n次返弹多高?
- 输出保留小数点后1位
具体做法:
我们遍历落地次数,第一次走过了落下高度这么多距离,然后弹起高度降低一半,然后走了弹起的高度这么多距离,完成一次循环,如果n个循环,累加距离,不断降低高度。需要注意最后一次落地后虽然要计算弹起的高度,我们还要输出它,但是我们走过的距离已经没有它的,我们此时已经是落地n次了,第n次落地相当于第n-1次弹起 。
利用C++的cout控制浮点数的输出位数我们要用到iomanip头文件,将cout.setf(ios::fixed)写在输出前面用于控制不足位数补零,并且在输出数据前要加<< fixed << setprecision(1)控制输出位数。
#include <iostream>
#include <iomanip>
using namespace std;
int main() {
// 下落的高度和落地的次数
double h;
int n;
cin >> h;
cin >> n;
double dis = 0;
for(int i = 0; i < n; i++){
dis += h; //每次加上落下来的距离
h /= 2; //弹起距离缩短一半
if(i == n - 1){
cout.setf(ios::fixed); //不足位自动补齐
cout << fixed << setprecision(1) << dis << " " << fixed << setprecision(1) << h << endl;
}
dis += h; //弹上去走的距离
}
return 0;
}
复杂度分析:
- 时间复杂度:O(n),一次遍历
- 空间复杂度:O(1),无额外空间