C 练习实例20 - 小球自由下落
题目:一球从100米高度自由落下,每次落地后反跳回原高度的一半;再落下,求它在第10次落地时,共经过多少米?第10次反弹多高?
程序分析:见下面注释。
程序源代码:
实例
#include <stdio.h>
#define INITIAL_HEIGHT 100.0
#define BOUNCE_COUNT 10
int main()
{
double h = INITIAL_HEIGHT;
double s = INITIAL_HEIGHT;
// 第一次反弹高度
h /= 2;
// 计算后续反弹高度和总路程
for (int i = 2; i <= BOUNCE_COUNT; i++) {
s += 2 * h;
h /= 2;
}
// 输出结果,指定小数位数为2位
printf("第%d次落地时,共经过%.5f米,第%d次反弹高%.5f米\n", BOUNCE_COUNT, s, BOUNCE_COUNT, h);
return 0;
}
以上实例输出结果为:
第10次落地时,共经过299.60938米,第10次反弹高0.09766米
剑心
425***[email protected]
实例有些复杂化了,从代码看不出逻辑出来。
这只是个单纯的 下落 + 反弹 的周期。
剑心
425***[email protected]
Atlantis
383***[email protected]
上边的笔记有点复杂了,这其实就是一个纯数学的算法,从第二次开始每次都是一上一下,高度只是前一次的一半,说白了就是等比数列的求和以及求第十项的大小。
等比数列的通项公式是:
等比求和:
所以计算运动路径的长度只需要把第二次到第十次的路径 * 2 + 第一次下落的高度 100 即可。
Atlantis
383***[email protected]
内拉小付
fux***[email protected]
参考方法:
内拉小付
fux***[email protected]
HIT_CCC
117***[email protected]
参考方法:
HIT_CCC
117***[email protected]
ronnyz
221***[email protected]
参考方法:
ronnyz
221***[email protected]
huanhuan
992***[email protected]
参考方法(递归法):
huanhuan
992***[email protected]