一.序言:

今天在逛C站的时候,突然发现一篇这样的文章《算法题: 一球从100米高度自由落下,每次落地后反跳回原高度的一半》。勾起了我的兴趣(就像小学生看见了加减法的题目,很兴奋,终于可以装13了)。

二.题目:

一球从100米高度自由落下,每次落地后反跳回原高度的一半;再落下,求它在 第10次落地时,共经过多少米?第10次反弹多高?

三.思路:

1.首先我们来看一下这个球的运动轨迹:
算法题: 一球从100米高度自由落下,每次落地后反跳回原高度的一半
2.解题思路:
我们可以清楚的看到:
a.一次反弹的高度,是原高度的一半:用高度除2循环或者递归所需次数,就能得出最终高度。
b1.经过的路程:球体原来的高度加上反弹的高度,就是一次路程,循环所需次数累加,就是总路程。
b2.经过的路程:除第一次和最后一次的高度都乘2,再加上第一次和最后一次的高度,就是最终路程。
b3.经过的路程:所有的高度都程2,再减去第一次的高度和最后一次的高度,就是最终路程。

以上是没有认真审题时,没看到路程是第10次落地时,不加上反弹路程时的思路。

经过的路程,我比较倾向于b1方案,最符合实际运动轨迹。

四.代码:

1.用球体运动轨迹来计算结果:

 //算法题: 一球从100米高度自由落下,每次落地后反跳回原高度的一半
 //题目:一球从100米高度自由落下,每次落地后反跳回原高度的一半;再落下,求它在 第10次落地时,共经过多少米?第10次反弹多高?
        //最终反弹高度    总共运动路程
        double height = 100,sum = 0;
        //球体运动
        for (int i = 0; i < 10; i++)
        {
            //本次路程
            double the = 0;
            //本次加下落路程
            the += height;
            //累加下落路程
            sum += height;
            //获取本次反弹高度
            height /= 2;
            Console.WriteLine($"第{i + 1}次反跳,高度为:{height}");
            //第10次落地,不用计算反弹高度
            if (i < 9)
            {
                //本次路程累加反弹高度
                the += height;
                //累加反弹路程
                sum += height;
            }
            Console.WriteLine($"第{i + 1}次路程:{the}");
            Console.WriteLine($"{i + 1}次反弹时,总路程:{sum}");
        }
        Console.WriteLine($"答:第10次落地时,共经过{sum}米,10次反弹{height}米");

算法题: 一球从100米高度自由落下,每次落地后反跳回原高度的一半

2.用2倍中间路程之后,最后加起始高度计算结果:

        double height = 100, sum = 0;
        for (int i = 0; i < 10; i++)
        {
            //反弹高度
            height /= 2;
            if (i < 9)
            {
                sum += height * 2;
            }
            Console.WriteLine($"第{i + 1}次反跳,高度为:{height}");
            Console.WriteLine($"第{i + 1}次反跳,总路程:{sum}");
        }
        //总路程加上最开始的100米
        sum +=  100;
        Console.WriteLine($"答:第10次落地时,共经过{sum}米,10次反弹{height}米");

算法题: 一球从100米高度自由落下,每次落地后反跳回原高度的一半

CSDN别的博主些的文章,保留了3位小数