一个球从100m高度自由落下, 每次落地后反跳回原高度的一半, 再落下, 再反弹。求它在第10次落地时, 共经过多少米, 第10次反弹多高。
分析下题目,不要给绕晕了.共经过多少米其实就是在说,一个小球,前九次落地反弹,再加上1次落地,一共经过多少米
而最后一次的反弹不算在经过多少米以内,直接将它的反弹高度求出来
第一种方法,算出十次落地加反弹的总米数,最后减去第十次反弹
这里采用的是算把一开始的下落和反弹看成一个周期,一共十个周期,因此算完后需要减去最后一个反弹高度
void main()
{
double height = 100, distance=0;
int time = 1;
while (time<=10)
{
distance += height;//加上下落的距离
height /= 2;//每次反弹的高度为原来的一半
distance += height;//加上反弹的距离
printf("%dth-distance=%lf,height=%lf\n",time, distance, height);
time++;
}
distance -= height;//因为这样算加上了最后一次的反弹高度,而共经过多少米是根据第10次落地来看的
printf("\nfinal_distance=%lf,height=%lf", distance, height);
}
第二种,先加上第一次落地,再求剩下落地加反弹.
这里让人难以理解的点在于第一次,比较特殊,这种方法把第一个周期看成是上图三个操作,之后,恢复成下图多余部分的操作
需要注意的是,反弹上去,也会下落,但这个下落高度和反弹高度一致,因此直接算上这两次的高度.
而又因为这个周期是没有包括最后一次的反弹高度的,所以求出来的总距离不需要减去反弹高度
void main()
{
double distance = 100, height = 100;
height /= 2;
for (int time = 2; time <= 10; time++)//因为算上了前一次的周期,所以不需要再算第一次,直接从第二次算起,直到第10次.
{
distance += height * 2;//两次反弹和下落的高度一致
height /= 2;
}
printf("distance=%lf,height=%lf", distance, height);
}
同样能够得到一样的结果,只不过计算的过程略有不同,理解还是第一种好理解
如有不足,还望指正!