小球从 h 高度自由落下,每次落地后反弹至原高度的二分之一再落下,当反弹高度低于 0.05 时认为不再弹起。求第几次落地后小球不再弹起,经过的总路程是多少?
#include
int main()
{
float h; //h表示小球释放时离地面的高度
int n;
double s = 0; //s表示小球总共经过的距离
printf("请输入小球开始离地面的高度h\n");
scanf("%lf", &h);
for(n=0;h>0.05;n++)
{
s=s+3/2*h;
h=1/2*h;
}
printf("在%d次落地时共经过%.2lf米\n",n,s);
return 0;
}
为什么我这个结果都没有进循环呢?
有两个原因:
一、在scanf用%lf格式转换符来读取输入存入float类型的变量h,导致h的数据错误了;
二、高度变量h的数据类型float和它参与的运算不相符合,因为运算过程出现了小数,所以把它改为double类型更适合
另外因为需要运算结果为double类型,所以for循环里面的数加个.0后缀保证其为double运算,以便让运算结果正确。
然后根据参考链接,发现最后一次反弹的高度需要去除,因为这个高度小于了0.05,所以不需要把它计算在内。
参考链接:
一个球从100m高度自由落下,每次落地后反弹回原高度的一半,再落下,再反弹。求它在第10次落地时共经过多少米,第10次反弹多高 - 张昊59 - 博客园
修改如下:
#include<stdio.h>
int main()
{
double h; //h表示小球释放时离地面的高度
int n;
double s = 0; //s表示小球总共经过的距离
printf("请输入小球开始离地面的高度h\n");
scanf("%lf", &h);
// printf("h=%f\n",h);
for(n=0;h>0.05;n++)
{
s=s+3.0/2*h;
//printf("s=%.f,h=%f",s,h);
h=1.0/2*h;
}
//https://www.cnblogs.com/xitidaan/p/14750290.html
s-=h;
printf("在%d次落地时共经过%.2lf米\n",n,s);
return 0;
}