题目主要信息
1、一球从hhh米高度自由落下,每次落地后反跳回原高度的一半再落下,求它在第555次落地时共经过了多少米?第555次返弹多高? 2、精度保留到小数点后6位,输出去掉后面的0
方法一:模拟
具体方法
遍历落地次数,第一次走过了落下高度这么多距离,然后弹起高度降低一半,然后走了弹起的高度这么多距离,完成一次循环,如果555个循环,累加距离,不断降低高度。
Java代码
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
public class Main {
public static void main(String[] args) throws IOException {
BufferedReader bf = new BufferedReader(new InputStreamReader(System.in));
String s;
while((s = bf.readLine()) != null){//多组输入
double h = Double.parseDouble(s);//记录总的
double temp = h/2;//弹跳多高
for(int i=1;i<5;i++){
h += temp * 2;
temp = temp/2;
}
System.out.println(h);
System.out.println(temp);
}
}
}
复杂度分析
- 时间复杂度:,循环只要4次,是常数时间。
- 空间复杂度:,只用了常数空间。
方法二:直接计算
具体方法
由于每次落下后弹起距离都是落下高度的一半,而计算的次数是一定的,只是因为初始高度不同,产生不同的结果,所以直接计算五次后的高度为多少原始高度除2的5次方,而累积高度就一次次的加上即可。
Java代码
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
public class Main{
public static void main(String[] args) throws IOException {
BufferedReader bf = new BufferedReader(new InputStreamReader(System.in));
String s;
while((s = bf.readLine()) != null){
double height = Double.parseDouble(s);
System.out.println(height+(height/2)*2+(height/4)*2+(height/8)*2+(height/16)*2);
System.out.println(height/32);
}
}
}
复杂度分析
- 时间复杂度:,直接计算,常数时间
- 空间复杂度:,无额外空间