习题4-8 高空坠球 (20 分)
皮球从某给定高度自由落下,触地后反弹到原高度的一半,再落下,再反弹,……,如此反复。问皮球在第n次落地时,在空中一共经过多少距离?第n次反弹的高度是多少?
输入格式:
输入在一行中给出两个非负整数,分别是皮球的初始高度和n,均在长整型范围内。
输出格式:
在一行中顺序输出皮球第n次落地时在空中经过的距离、以及第n次反弹的高度,其间以一个空格分隔,保留一位小数。题目保证计算结果不超过双精度范围。
输入样例:
33 5
输出样例:
94.9 1.0
分析:
本题要注意的关键点--->
(1)下落的次数和反弹的次数并不是相等的,第n次下落对应的是第n-1次反弹
(2)注意第0次落地和第1次落地时情况特殊处理:第0次落地时,空中经过的距离和反弹高度都为0;第一次落地时,空中经过高度为h,反弹高度为h/2
注意:我们这里是以落地次数来循环的,因为落地次数比反弹多1次(第n次下落对应的是第n-1次反弹),题目问的是第n次反弹高度,所以最后还要h/2;
代码:
#define _CRT_SECURE_NO_WARNINGS 1
#include<stdio.h>
#include<stdlib.h>
int main()
{
double h=0;
double sum = 0;//在空中经过的距离
int n = 0;
scanf("%lf %d", &h, &n);
sum = h;//默认n=1时的情况
if (n == 0)//当第0次落地要特别处理,因为在空中经过的距离和反弹高度都为0
{
sum = 0;
h = 0;
}
for (int i = 2; i <= n; i++)
{
h = h / 2;
sum = sum + 2*h;
}
//循环记录的是第n次落地时的高度h,求反弹高度还要计算一次
h = h / 2;
printf("%.1f %.1f\n", sum, h);
system("pause");
return 0;
}
测试结果:
该博客探讨了高空坠球的问题,其中皮球从一定高度自由落下并按照一定比例反弹。文章详细介绍了如何计算第n次落地时皮球在空中经过的总距离和第n次反弹的高度。关键点包括区分下落和反弹次数,处理特殊情况如第0次和第1次落地,并提供了代码实现来解决这个问题。

859

被折叠的 条评论
为什么被折叠?



