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

C 語言經典題:自由落體反彈距離與高度計算(含註釋完整代碼)

     編輯:程式設計綜合問答

題目復述

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

數學模型

  • 第 1 次落地:距離 = H
  • 第 i (i>1) 次落地:新增距離 = 2 * H * (1/2)^(i-1)(上升+下降)
  • 第 n 次反彈高度 = H * (1/2)^n
  • 總距離 = H + 2*H*Σ(1/2)^i (i=1..n-1) = H * (3 - (1/2)^(n-2)) (n≥2)

完整註釋代碼

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

int main(void) {
    double height;  // 初始高度,用 double 保證精度
    int n;          // 次數
    double distance = 0.0;
    double current_height;

    // 輸入處理:兼容 scanf 返回值判斷 EOF
    if (scanf("%lf %d", &height, &n) != 2) return 1;

    current_height = height;
    distance = height;  // 第一次下落

    // 循環累加第 2 到第 n 次落地的往返距離
    for (int i = 1; i < n; i++) {
        current_height /= 2.0;       // 反彈高度遞減
        distance += 2 * current_height; // 上升 + 下降
    }

    // 第 n 次反彈高度(循環結束時 current_height 已是第 n 次反彈高度)
    double rebound_height = current_height / 2.0; // 注意:循環執行 n-1 次後 current_height = H*(1/2)^(n-1),再除2得第n次反彈
    // 更直觀:rebound_height = height * pow(0.5, n);

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

關鍵點解析

  1. double 而非 float: 題目保證結果在雙精度範圍,單精度會導致大數精度丟失。
  2. 循環邊界: i < n 而非 i <= n,因第一次下落已單獨計算。
  3. 避免 pow 重複計算: 迭代除以 2.0 比 pow(0.5, i) 更高效、精度更穩。
  4. 輸出格式: %.1f 強制保留一位小數,符合題目要求。

測試樣例

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;第 5 次反彈 33/32 = 1.03125 ≈ 1.0。

掌握「首項單獨處理 + 迭代累加 + 邊界精確控制」模式,此類遞推數列問題迎刃而解。

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