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

UVa 11346 Probability:幾何概率與積分應用

     編輯:關於C++

題目描述

在 a×b 的矩形中隨機取點 (x,y),求 x*y < S 的概率。輸出百分比,保留 6 位小數。

數學推導

曲線 x*y = S 是雙曲線。矩形面積 M = a*b。

若 S ≥ M,概率 = 0;若 S = 0,概率 = 1。

對於 0 < S < M,滿足 x*y ≥ S 的區域面積為:

∫S/ba (S/x) dx = S * ln(a / (S/b)) = S * ln(ab/S) = S * ln(M/S)

加上 x ∈ [0, S/b] 時 y 恆 ≥ S/b 矩形面積 S。
所以 x*y ≥ S 的總面積 = S + S*ln(M/S)。
目標面積 = M - S - S*ln(M/S)。
概率 = (M - S - S*ln(M/S)) / M。

代碼實現 (C++)

#include 
#include 

int main() {
    int T; scanf("%d", &T);
    while (T--) {
        double a, b, S;
        scanf("%lf%lf%lf", &a, &b, &S);
        double M = a * b;
        double ans;
        if (S >= M) ans = 0.0;
        else if (S == 0) ans = 1.0;
        else ans = (M - S - S * log(M / S)) / M;
        printf("%.6lf%%\n", ans * 100);
    }
    return 0;
}

注意事項

  • 邊界條件 `S >= M` 和 `S == 0` 必須單獨判斷,避免 `log(0)` 或除零。
  • 使用 `log` 為自然對數(底數 e)。
  • 輸出格式:百分比符號 `%%`,保留 6 位小數。
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved