首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> 更多程式語言 >> 程式設計綜合問答

C 語言彈跳球問題:計算第 n 次落地總路程與反彈高度

     編輯:程式設計綜合問答

題目重述

皮球從高度 H 自由落下,觸地後反彈至原高度一半,再落下,循環往複。求第 n 次落地時總路程、第 n 次反彈高度。輸入 H、n(長整數範圍),輸出保留一位小數。

數學模型

  • 初始下落:H
  • 第 1 次反彈上升:H/2,下落:H/2 → 增加 H
  • 第 2 次反彈上升:H/4,下落:H/4 → 增加 H/2
  • ... 第 i 次反彈增加 H / 2^(i-1)
  • 第 n 次落地總路程 = H + 2 * H * (1 - (1/2)^(n-1)) = 3H - H/2^(n-2) (n≥2)
  • 第 n 次反彈高度 = H / 2^n

C 語言實作

#include <stdio.h>
#include <math.h>

int main(void) {
    double H;
    int n;
    printf("Input height: ");
    scanf("%lf", &H);
    printf("Input n: ");
    scanf("%d", &n);

    double distance = H; // 初始下落
    for (int i = 1; i < n; i++) { // 第 1 到 n-1 次反彈各經歷上升+下落
        distance += 2 * H * pow(0.5, i);
    }
    double height = H * pow(0.5, n); // 第 n 次反彈高度

    printf("%.1f %.1f\n", distance, height);
    return 0;
}

樣例驗證

Input:
33 5

Output:
94.9 1.0

手算:33 + 2*(16.5+8.25+4.125+2.0625) = 33 + 61.875 = 94.875 ≈ 94.9;反彈高度 33/32 = 1.03125 ≈ 1.0。

注意事項

  • 使用 `double` 儲存高度與路徑,避免整數除法截斷。
  • `pow(0.5, i)` 計算 1/2^i,`math.h` 需連結 `-lm` (GCC)。
  • 輸出格式 `%.1f` 保留一位小數,符合題目要求。
  • 邊界:n=0 視為未落地,依題意 n≥1。

總結

利用等比數列求和公式或迴圈累加均可解決。迴圈寫法直觀易懂,效能在 n 較小(長整數範圍)下完全足夠。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved