题意整理。
- 一个小球从h高度落下,每次反弹高度是原高度的一半。
- 求第n次落地时,经过了多少米,第n次反弹多高。
方法一(循环)
1.解题思路
- 利用循环计算每次反弹时的高度(记为h),以及经过了多少米(记为dist)。
- 由于要输出的是第n次落地时走了多少米,所以dist要减去最后反弹的高度h。
动图展示:
2.代码实现
#include <iostream>
#include <iomanip>
using namespace std;
int main() {
// 下落的高度和落地的次数
double h;
int n;
cin >> h;
cin >> n;
//记录第n次反弹时总共走过的记录
double dist=0;
for(int i=1;i<=n;i++){
h/=2;
//向下过程中走2*h,反弹h高度,总共3*h
dist+=h*3;
}
//由于要输出的是第n次落地时走了多少米,所以dist要减去最后反弹的高度h
cout<<fixed<<setprecision(1)<<dist-h<<" "<<h<<endl;
return 0;
}
3.复杂度分析
- 时间复杂度:循环总共执行n次,所以时间复杂度为。
- 空间复杂度:需要额外常数级别的空间,所以空间复杂度为。