球弹跳高度的计算

GitHub跳转原题关系图返回列表

反弹高度构成公比 1/2 的等比数列,总路程=初始下落+前 9 次反弹的往返,即 3h-h/512;第 10 次反弹高 h/1024,按 6 位有效数字输出。

OJ: roj

题目 ID: 1085

难度:入门

标签:模拟等比数列浮点输出

创建: 2026-09-29 18:05

更新: 2026-10-05 00:33

题目描述

一球从高度 hh(米)自由落下,每次落地后反弹回当前高度的一半再落下。求第 10 次落地时总共经过的米数,以及第 10 次反弹的高度。输入一个整数 hh;输出两行:第一行为到第 10 次落地时一共经过的米数,第二行为第 10 次反弹的高度。结果可能是实数,用 double 保存,用 cout << x 或 printf("%g", x) 输出即可(6 位有效数字、去尾零)。

样例输入:20;样例输出:59.9219 与 0.0195312。

思路

反弹高度构成公比 1/21/2 的等比数列 hi=h/2ih_i=h/2^i。总路程 = 初始下落 hh + 前 9 次反弹的往返 2hi=3h−h/5122h_i = 3h-h/512;第 10 次反弹高度 h/1024h/1024。直接用 double 套公式即可。

参考代码

Python 版:

python
#!/usr/bin/env python3
# Author by Rainboy blog: https://rainboylv.com github: https://github.com/rainboylvx
# rbook: -> https://rbook.roj.ac.cn  https://rbook2.roj.ac.cn
# rainboy的学习导航网站: https://idx.roj.ac.cn
# create_at: 2026-09-29 18:05
# update_at: 2026-09-29 18:05

import sys

LANDINGS = 10  # 题面固定的落地次数


def solve() -> None:
    h = float(next(sys.stdin))  # 初始高度

    # 总路程 = 初始下落 h + 前 9 次反弹的往返(第 i 次反弹高度为 h / 2^i,往返各一次)
    total = h + sum(h / 2**i * 2 for i in range(1, LANDINGS))

    # 输出格式对齐 C++ 的 cout 默认行为:6 位有效数字、去掉多余末尾 0,即 %g
    print("%g" % total)
    print("%g" % (h / 2**LANDINGS))  # 第 10 次反弹的高度


if __name__ == "__main__":
    solve()

C++ 版(同一算法):

cpp
/**
 * Author by Rainboy blog: https://rainboylv.com github: https://github.com/rainboylvx
 * rbook: -> https://rbook.roj.ac.cn  https://rbook2.roj.ac.cn
 * rainboy的学习导航网站: https://idx.roj.ac.cn
 * create_at: 2026-10-05 00:33
 * update_at: 2026-10-05 00:33
 */

#include <bits/stdc++.h>
using namespace std;

typedef long long ll;

const int LANDINGS = 10; // 题面固定的落地次数

int main() {
    ios::sync_with_stdio(false);
    cin.tie(nullptr);

    double h; // 初始高度,用 double 保存
    cin >> h;

    // 总路程 = 初始下落 h + 前 9 次反弹的往返(第 i 次反弹高度为 h/2^i,往返各一次)
    double total = h;
    double cur = h / 2.0;
    for (int i = 1; i < LANDINGS; i++) {
        total += 2.0 * cur; // 当前曲线的来回各一段
        cur /= 2.0;          // 下一段反弹高度减半
    }

    // 第 10 次反弹的高度
    double h10 = h / (1LL << LANDINGS); // h / 2^10 = h / 1024,用 64 位整数保证精确

    // 输出对齐 C++ cout 默认行为:6 位有效数字、去尾零
    cout << total << "\n" << h10 << "\n";

    return 0;
}