題目大意:長度 L 的細桿加熱 n 度後膨脹為 L' = (1 + n·C)·L。兩端固定時桿彎成圓弧,原桿長為弦長。求弧中點到弦中點的距離(隆起高度)。輸入多組 L, n, C,以三個負數結束。保證膨脹長度不超過原長 1.5 倍。
設弧半徑 R,弦長 L,弧長 L'。幾何關係:
弦長 L = 2R sin(θ) → θ = asin(L / 2R)
弧長 L' = 2Rθ = 2R·asin(L / 2R)
隆起高度 h = R - R cos(θ) = R(1 - cosθ)
由弦長與弧高關係:R = (h² + L²/4) / 2h
目標:找到 h 使得 L' = 2R·asin(L/2R)。h 單調遞增 → L' 單調遞增,可在 [0, L/2] 區間二分 h。
double L, n, C;
while (scanf("%lf%lf%lf", &L, &n, &C) == 3) {
if (L < 0 && n < 0 && C < 0) break;
double L1 = (1 + n * C) * L;
double low = 0, high = L / 2, mid;
while (high - low > 1e-5) {
mid = (low + high) / 2;
double R = (mid*mid + L*L/4) / (2*mid);
double arc = 2 * R * asin(L / (2*R));
if (arc <= L1) low = mid;
else high = mid;
}
printf("%.3lf\n", mid);
}
high - low > 1e-5 保證輸出小數點後三位正確。asin 參數域 [-1,1],L/(2R) 恆 ≤ 1。