java经典面试题:一个球从100米高度自由落下,每次落地后反弹回原高度的一半,再落下。 它在第10次落地时,共经过多少米?第10次反弹多高?

1.题目解析

        球经过的路径:下落经过的距离+落地弹起的高度

推测,第三次落地,那么他经过的路径如下

第一次落地: 100

第一次弹起高度:100/2

第二次落地:50

第二次弹起:50/2

第三次落地:25

第三次弹出 25/2

故此,第三次所经过的路径 = 100+100/2+50+50/2+25 = 250  

x  + x/2 +x/2 + x /2*2 + x /2*2...

2.代码实现

方式一:

 /**
     * <p>计算第count次小球所经过的路径以及弹起的高度</p>
     *
     * @param height  初始的高度
     * @param count  弹起的次数
     */
    public static void computed(float height, int count) {
        // 边界判断
        if (height <= 0 || count < 1) {
            throw new RuntimeException("非法参数");
        }
        // 第一次落地高度
        float length = height;
        int i = 1;
        // 参数校验
        if (i == count) {
            System.out.println(0);
        }
        while (i < count) {
            length += 2 * height / (2 * i);
            i++;
            if (i==count) {
                System.out.println("第"+i+"次小球弹起的高度height="+height/(Math.pow(2,i)));
            }
        }
        System.out.println("第"+i+"次小球所经过的路径length =" + length);
    }

 方式二:

 /**
     * 求每次小球落地后反跳回原高度一半
     * 解题步骤:
     * step-1: 定义获取球经过的长度变量 length
     * step-2: 计算球下落经过的长度 length = length + height
     * step-3: 计算第i次下降后弹起返回的高度 height = height / 2;
     *
     * @param height    初始化高度
     * @param count 弹跳次数
     * @return
     */
    private static void computed(float height, int count) {

        // 参数校验
        if (height <= 0 || count <1) {
            throw new RuntimeException("参数非法!");
        }
        // 定义长度的辅助变量
        float length = 0f;
        // 小球的弹跳循环次数
        for (int i = 1; i <= count; i++) {
            // 加上第i次要下降的高度
            length += height;
            // 第i次下降后返回的高度
            height = height / 2;
            // 如果是第count(弹跳的次数)次,那么这次不加往上的高度
            if (i == count) {
                System.out.println("第"+i+"次小球反弹的高度=" + height);
            } else {
                //小球向上弹跳的高度
                length += height;
            }
        }
        System.out.println("第"+count+"次小球落地经过的路径=" + length);
    }

  • 0
    点赞
  • 12
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值