1028:自由下落的球

版权声明:看看就好,如需转载,注明一下出处 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;
}

 

猜你喜欢

转载自blog.csdn.net/sinat_34337520/article/details/89177345