版权声明:看看就好,如需转载,注明一下出处 https://blog.csdn.net/sinat_34337520/article/details/89177345
Description
一球从M米高度自由下落,每次落地后返回原高度的一半,再落下。它在第N次落地时反弹多高?共经过多少米?保留两位小数
Input
M N
Output
它在第N次落地时反弹多高?共经过多少米?保留两位小数,空格隔开,放在一行
Sample Input
1000 5
Sample Output
31.25 2875.00
Note:
这题提供两个版本的思路。
版本1:循环计算,h每次减一半,s每次加上2趟h(弹起再落下),这里循环走了N-1次,因为在第N次落地时,s就不再变化。最后h需要再减半一次,因为题目要求第N次落地时,反弹的高度。
版本2:利用等差数列求和公式
扫描二维码关注公众号,回复:
5930604 查看本文章
首项a1=M, h每次减半,所以公比q=0.5,h为第(N+1)项 a(N+1) 的值。这里前N项和为:第N次落地前每趟下落(或反弹)走过的距离,即每趟h之和。经过的距离 s = 反弹 +下落 - M:第一趟只有下落没有反弹
#include <stdio.h>
//版本1:循环计算
int main()
{
int N, i;
float M, h, s;
scanf("%f %d", &M, &N);
s = M;
h = M;
for(i=1; i<N; i++)
{
h = h/2;
s += 2*h;
}
h = h/2;
printf("%.2f %.2f", h, s);
return 0;
}
//版本2:等比数列
int main()
{
int N;
float M, h, Sn, s;
scanf("%f %d", &M, &N);
h = M * pow(0.5, N);//首项a1=M, 公比q=0.5,h为第(N+1)项 a(N+1)
Sn = M * (1 - pow(0.5, N)) / (1-0.5);//Sn 为前N项和:第N次落地前每趟下落走过的距离
s = 2*Sn - M;//反弹+下落-M:第一趟只有下落没有反弹
printf("%.2f %.2f", h, s);
return 0;
}