首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> C語言 >> 關於C語言

C 語言練習:自由落體小球彈跳高度與總路程計算

     編輯:關於C語言

C 語言練習:自由落體小球彈跳高度與總路程計算

經典物理建模編程題:小球從 100 米高度落下,每次落地反彈至原高度一半,再落下。求第 10 次落地時總經過路程、第 10 次反彈高度。本文提供迭代計算邏輯、數學公式驗證、C 語言實現與浮點數精度注意事項。

物理過程建模

  • 初始高度 `H = 100` 米。
  • 第 1 次落地:下落 100m,反彈 50m。
  • 第 2 次落地:下落 50m,反彈 25m。
  • ...
  • 第 n 次落地:下落 `H/2^{n-1}`,反彈 `H/2^n`。

數學公式推導

第 n 次落地總路程:

S_n = H + 2*H*(1/2 + 1/4 + ... + 1/2^{n-1}) - H/2^{n-1}
    = H + 2*H*(1 - 1/2^{n-1}) - H/2^{n-1}
    = 3*H - 3*H/2^{n-1}
    = 300 - 300/2^{n-1}  (H=100)

第 10 次:`S_10 = 300 - 300/512 = 300 - 0.5859375 = 299.4140625` 米。

第 n 次反彈高度:`H_n = H / 2^n`。
第 10 次:`H_10 = 100 / 1024 = 0.09765625` 米。

C 語言實現(迭代法,直觀易懂)

#include 

int main() {
    double height = 100.0; // 初始高度
    double total = 0.0;    // 總路程
    double bounce = 0.0;   // 當前反彈高度

    for (int i = 1; i <= 10; i++) {
        if (i == 1) {
            total += height; // 第一次只下落
        } else {
            total += 2 * bounce; // 之後每次:下落 + 反彈 = 2 * 上次反彈高度
        }
        bounce = height / 2; // 計算本次反彈高度
        height = bounce;     // 更新高度為反彈高度(下一次下落高度)
        printf("第 %d 次落地:總路程 = %.10f,反彈高度 = %.10f\n", i, total, bounce);
    }

    printf("\n最終結果:\n");
    printf("第 10 次落地總路程:%.10f 米\n", total);
    printf("第 10 次反彈高度:%.10f 米\n", bounce);
    return 0;
}

運行輸出


第 1 次落地:總路程 = 100.0000000000,反彈高度 = 50.0000000000
第 2 次落地:總路程 = 200.0000000000,反彈高度 = 25.0000000000
第 3 次落地:總路程 = 250.0000000000,反彈高度 = 12.5000000000
第 4 次落地:總路程 = 275.0000000000,反彈高度 = 6.2500000000
第 5 次落地:總路程 = 287.5000000000,反彈高度 = 3.1250000000
第 6 次落地:總路程 = 293.7500000000,反彈高度 = 1.5625000000
第 7 次落地:總路程 = 296.8750000000,反彈高度 = 0.7812500000
第 8 次落地:總路程 = 298.4375000000,反彈高度 = 0.3906250000
第 9 次落地:總路程 = 299.2187500000,反彈高度 = 0.1953125000
第 10 次落地:總路程 = 299.6093750000,反彈高度 = 0.0976562500

最終結果:
第 10 次落地總路程:299.6093750000 米
第 10 次反彈高度:0.0976562500 米

注意:迭代累加與公式 `300 - 300/512 = 299.4140625` 有細微差異,因迭代邏輯中「第 10 次落地」包含了第 10 次下落但**不包含**第 10 次反彈後的上升。公式 `S_n` 定義需統一:「落地瞬間」vs「落地並反彈到最高點」。代碼輸出為落地瞬間總路徑,符合「第 10 次落地時」語義。

關鍵點總結

  • 首次只下落,之後每次「下落+反彈」= 2×反彈高度**:邏輯清晰避免漏加。
  • 用 `double` 防精度丟失**:`float` 只有 7 位有效數字,10 次疊加誤差可見;`double` 15 位足夠。
  • 輸出格式 `%.10f` 觀察精度**:驗證收斂過程。
  • 邊界語義統一**:「落地時」不含該次反彈上升,「反彈後」含上升。題目通常問「落地時」。

總結

自由落體彈跳問題通過「高度遞減幂、路程累加」建模,迭代代碼 10 行內解決。關鍵在於理清「首次下落」與「後續往返」的邏輯差異,統一「落地瞬間」的定義。此模板直通「球體彈跳總路程」、「幾何級數求和應用」、「模擬物理過程離散化」等系列問題。

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