2016校招真题之小球的距离

1、题目描述

小东和三个朋友一起在楼上抛小球,他们站在楼房的不同层,假设小东站的楼层距离地面N米,球从他手里自由落下,每次落地后反跳回上次下落高度的一半,并以此类推知道全部落到地面不跳,求4个小球一共经过了多少米?(数字都为整数)

给定四个整数A,B,C,D,请返回所求结果。

测试样例:
100,90,80,70
返回:1020
 

2、代码实现

 1 package com.wcy.october;
 2 
 3 /**
 4  * 时间:2016年10月16日 题目:小球的距离
 5  * 题目描述:小东和三个朋友一起在楼上抛小球,他们站在楼房的不同层,假设小东站的楼层距离地面N米,球从他手里自由落下,每次落地后反跳回上次下落高度的一半,
 6  * 并以此类推知道全部落到地面不跳,求4个小球一共经过了多少米?(数字都为整数),给定四个整数A,B,C,D,请返回所求结果。
 7  * 测试样例:100,90,80,70 返回:1020
 8  * 解题思路:刚开始做这个题受到了括号里 数字都为整数的误导,以为落地距离是5米,弹起后2米(5/2自动取整)。算出来结果不对,变小了。所以,不是自动取整。
 9  * 就是所有的都算进去,这就牵扯到数学上的极限思想了。除了最开始的下落高度只加一次外,以后的弹起下落都是两倍的距离。举个例子,下落高度是x米,则有下落后弹
10  * 起的高度是x/2,再落下去,又走了一个x/2,依此类推,一直下去,也就是总距离为x+2*x(1/2+1/4+1/8+……),而括号中的数列是一个等比数列,其极
11  * 限求和的结果就是1。所以总距离就是3*x。推理到这里,就发现写程序只需要一行关键代码就可以。
12  */
13 public class Balls {
14 
15     public int calcDistance(int A, int B, int C, int D) {
16         return 3*(A+B+C+D);
17     }
18 
19     public static void main(String[] args) {
20         Balls balls = new Balls();
21         int result = balls.calcDistance(100, 90, 80, 70);
22         System.out.println(result);
23     }
24 }
 
原文地址:https://www.cnblogs.com/wangchaoyuan/p/5967720.html