题目
一球从100米高度自由落下,每次落地后反跳回原高度的一半;再落下,求它在 第10次落地时,共经过多少米?第10次反弹多高?
思路
这题其实也是一个简单的数列
我们先不考虑反弹的路径, 只考虑高度
假如 第球从y米落下, 第n次的高度是y(n)
那么第一次的高度就是 y, 第二次高度就是y/2, 第3次就是y/4…
所以总的高度之和
的公式就是
∑
i
=
1
n
x
n
\sum_{i=1}^nx_n
∑i=1nxn =
x
1
+
x
2
+
x
3
.
.
.
+
x
n
x_1 + x_2 +x_3... +x_n
x1+x2+x3...+xn
其中 x n x_n xn = y * ( 1 2 ) n − 1 (\frac{1}{2})^{n-1} (21)n−1, 这就是求某次高度的公式。
而反单的高度就可以用上面的公式得出来了。
至于总路径无非就是总下落之和 加上总反弹之和。
我们以从反弹到落地计算为1次, 则每次反弹和下落的路径是一样的
但是第一次其实球其实没有反单的, 因为初始位置就是100
而问题问的第10次反弹高度,应该是问第10次落地, 再反弹多少米,实际上这个反单在程序里是算第11次。
思路清晰后, 代码就很简单了
java 代码
public class BallFall {
public static void main(String[] args) {
System.out.println(MessageFormat.format
("ball fall from {0} meters, when hit {1} times, total {2} meters have passed",
100, 10, new BallFallUtil().getTotal(100, 10)));
System.out.println(MessageFormat.format
("ball fall from {0} meters, when hit {1} times, The ball will bounce {2} meters",
100, 10, new BallFallUtil().getUp(100, 10 + 1)));
}
}
/**
* 一球从100米高度自由落下,每次落地后反跳回原高度的一半;再落下,求它在 第10次落地时,共经过多少米?第10次反弹多高?
*/
class BallFallUtil{
public Double getTotal(int start, int fallTime){
Double fall = 0d;
Double up = 0d;
Double sum = 0d;
for (int i=1; i <= fallTime; i++){
fall = start * Math.pow(0.5, i-1);
if (i > 1){
up = fall;
}
sum = sum + fall + up;
}
return sum;
}
public Double getUp(int start, int fallTime){
//if fallTime = 1 then up = 0;
Double up = 0d;
//up = fall
if (fallTime > 1){
up = start * Math.pow(0.5, fallTime - 1);
}
return up;
}
}
输出:
ball fall from 100 meters, when hit 10 times, total 299.609 meters have passed
ball fall from 100 meters, when hit 10 times, The ball will bounce 0.098 meters