/*
本文系「人工智能安全」(微信公众号)原创,转载请联系本文作者(同博客作者)。
欢迎你转发分享至朋友圈,并给予「关注、星标、点赞」三连支持。互相欣赏,互相批判。
我是一名有诗人气质的网络安全工程师
期待与你的思想交流碰撞出智慧的花火
水木清华
2020-03-20
求小球落地5次后所经历的路程和第5次反弹的高度
*/
#include <iostream>
#include <iomanip> //包含输出数的位数控制函数 setprecision() 的头文件
//#include <algorithm>,采用方法二“幂函数直接求解反弹高度”时使用
using namespace std;
//球落地反弹的函数接口
int Ball_Bounce(int num)
{
    int bounce_time = 5; //设置反弹次数
    int drop_time = 5; //设置落地次数
    double path_length = 0.0; //经过的路径总长度
    double bounce_height = 0.0; //单次反弹高度
    //方法一:可以用递归来依次求解反弹高度
    bounce_height = double(num) / 2; //第一次反弹的高度
    for (int i = 2; i <= bounce_time; i++)
    {
        bounce_height = bounce_height / 2;
    }
    //方法二:可以用幂函数来直接求解反弹高度,但好像不是很稳定,耗时稍长:bounce_height = double(num) / pow(2, bounce_time);
    double length = double(num); //第一次落地的路径长度
    path_length += length; //累计经过的路径总长度,从第一次落地开始记录
    for (int i = 2; i <= drop_time; i++)
    {
        //每次落地的路径长度为上一次落地的路径长度的一半
        length = length / 2;
        //从第二次落地开始,每次落地的路径长度和当前反弹高度相等,故该往返(反弹-落地)经过的路径长度为该次落地的路径长度的两倍
        path_length += 2 * length;
    }
    //保留六位有效数字
    cout << setprecision(6) << path_length << '\n' << bounce_height << endl;
    return 0;
}
//主函数
int main()
{
    int starting_height; //输入起始高度
    while (cin >> starting_height)
    {
        Ball_Bounce(starting_height); //调用球落地反弹的函数接口
    }
    return 0;
}