题目主要信息

1、一球从hhh米高度自由落下,每次落地后反跳回原高度的一半再落下,求它在第555次落地时共经过了多少米?第555次返弹多高? 2、精度保留到小数点后6位,输出去掉后面的0

方法一:模拟

具体方法

遍历落地次数,第一次走过了落下高度这么多距离,然后弹起高度降低一半,然后走了弹起的高度这么多距离,完成一次循环,如果555个循环,累加距离,不断降低高度。

alt

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);
        }

    }
}

复杂度分析

  • 时间复杂度:O(1)O(1),循环只要4次,是常数时间。
  • 空间复杂度:O(1)O(1),只用了常数空间。

方法二:直接计算

具体方法

由于每次落下后弹起距离都是落下高度的一半,而计算的次数是一定的,只是因为初始高度不同,产生不同的结果,所以直接计算五次后的高度为多少原始高度除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);
        }

    }
}

复杂度分析

  • 时间复杂度:O(1)O(1),直接计算,常数时间
  • 空间复杂度:O(1)O(1),无额外空间