<谭> 6.9
一球从100m高度自由落下,每次落地后反跳回原高度的一半再落下。求它在第10次落地时共经过多少m? 第10次反弹多高?
#include <stdio.h>
int main()
{
float an = 100 ; /* 第一次落地前的高度 */
float sn = an ; /* 第一次落地时总路程 */
int i ;
for ( i = 2; i <= 10; i++)
{
an = an / 2 ;
sn = sn + an * 2 ;
}
printf("Sum=%fm\n",sn);
printf("The tenth hight is: %fm\n",an / 2);
return 0;
}
运行结果:
======================================
Sum=299.609375m
The tenth hight is: 0.097656m
======================================
★ 如此设计时绕了个小弯儿, 即第10次落地时的an为第9次反弹的高度, 因此在输出时又一次减半为an/2, 验证如下:
#include <stdio.h>
int main()
{
float an = 100 ;
float sn = an ;
int i ;
for ( i = 2; i <= 10; i++)
{
an = an / 2 ;
printf("i=%2d an=%f\n", i, an);
sn = sn + an * 2 ;
printf(" sn=%f\n", sn);
}
printf("\nSum=%fm\n",sn);
printf("The tenth hight is: %fm\n",an / 2);
return 0;
}
运行结果:
================================
i= 2 an=50.000000
sn=200.000000
i= 3 an=25.000000
sn=250.000000
i= 4 an=12.500000
sn=275.000000
i= 5 an=6.250000
sn=287.500000
i= 6 an=3.125000
sn=293.750000
i= 7 an=1.562500
sn=296.875000
i= 8 an=0.781250
sn=298.437500
i= 9 an=0.390625
sn=299.218750
i=10 an=0.195313
sn=299.609375
Sum=299.609375m
The tenth hight is: 0.097656m
================================
★ 若用书上的方法, 无此问题, 也就是将an各sn的操作换个顺序
#include <stdio.h>
int main()
{
float sn = 100 ;
float an = sn / 2 ;
int i ;
for ( i = 2; i <= 10; i++)
{
sn = sn + an * 2 ;
printf("i=%2d sn=%f\n", i, sn); /* 验证用 */
an = an / 2 ;
printf(" an=%f\n", an); /* 验证用 */
}
printf("\nSum=%fm\n",sn);
printf("The tenth hight is: %fm\n",an);
return 0;
}
运行结果:
=================================
i= 2 sn=200.000000 说明: 第二次落地经过的路程
an=25.000000 说明: 第二次弹起的高度
i= 3 sn=250.000000
an=12.500000
i= 4 sn=275.000000
an=6.250000
i= 5 sn=287.500000
an=3.125000
i= 6 sn=293.750000
an=1.562500
i= 7 sn=296.875000
an=0.781250
i= 8 sn=298.437500
an=0.390625
i= 9 sn=299.218750
an=0.195313
i=10 sn=299.609375
an=0.097656
Sum=299.609375m
The tenth hight is: 0.097656m
=================================
评论