题意整理

  • 给定小球的初始高度和落地次数,每次小球落地后,会反弹回原高度的一半,再落下。
  • 求落地若干次后,小球反弹的高度,以及最后一次落地时,经过的总距离。

方法一(循环)

1.解题思路

  • 定义一个变量distance,用于记录第n次反弹后经过的总距离。
  • 使用循环模拟落地反弹的过程,每次反弹,高度减半,每次经过的距离为反弹后距离的三倍,总距离只需将每次的距离累加。
  • 由于最后要计算第n次落地时经过的距离,所以要减去最后一次反弹的高度,即distance-h。

动图展示: alt

2.代码实现

import java.util.Scanner;

public class Main {
    public static void main(String[] args) {
        //标准输入
        Scanner scanner=new Scanner(System.in);
        //高度
        float h=scanner.nextFloat();
        //落地次数
        int n =scanner.nextInt();

        //第n次反弹后经过的总距离
        float distance=0;
        for(int i=1;i<=n;i++){
            //高度减半
            h/=2;
            //记录距离相应的变化
            distance+=h*3;
        }
        //由于要计算第n次落地时经过的距离,所以要减去最后一次反弹的高度,即distance-h
        System.out.println(String.format("%.3f", h)+" "+String.format("%.3f", distance-h));

    }
}

3.复杂度分析

  • 时间复杂度:总共需要循环n次,所以时间复杂度为O(n)O(n)
  • 空间复杂度:需要额外常数级别的空间,所以空间复杂度为O(1)O(1)