日期:2025年10月6日
ZeroJudge 題目連結:f332. 貝瑞的鐵線體積
解題想法
如果函數為 $y = f(x)$,將此函數曲線以 $x$ 軸為轉軸旋轉,旋轉體體積為 $$ V = \pi \int_a^b y^2 dx $$
Python 程式碼
使用時間約為 22 ms,記憶體約為 3.4 MB,通過測試。
import math
t = int(input()) # 共 t 筆測資
for _ in range(t): # 執行 t 次
n = int(input()) # 多項式最高次方
poly = list(map(int, input().split())) # 多項式由高到低次方各項係數
square = [0]*(2*n + 1) # 多項式平方各項係數
for i in range(n+1):
for j in range(n+1):
square[i+j] += poly[i]*poly[j]
integral = [0]*(2*n + 1) # 平方後積分結果,忽略常數項
for i in range(2*n + 1): # 計算積分式
integral[i] = 1.0 * square[i] / (2*n + 1 - i)
ans = 0.0 # 積分結果
a, b = map(int, input().split()) # 積分下限、上限
for i, c in enumerate(integral): # 代入積分下限、上限
ans += c * (b**(2*n + 1 - i) - a**(2*n + 1 - i))
print(f"{math.pi*ans:.2f}") # 印出答案時再乘以 pi
C++ 程式碼
要用 double,不能用 float,而且 pi 的位數要取多一點。使用時間約為 2 ms,記憶體約為 160 kB,通過測試。
#include <cstdio>
#include <cmath>
using namespace std;
int main() {
int t; scanf("%d", &t); // 共 t 筆測資
while(t--) { // 執行 t 次
int n; scanf("%d", &n); // 多項式最高次方
int poly[n+1]; // 多項式由高到低次方各項係數
for(int i=0; i<=n; i++) scanf("%d", &poly[i]);
int square[2*n + 1] = {0}; // 多項式平方各項係數
for(int i=0; i<=n; i++) {
for(int j=0; j<=n; j++) {
square[i+j] += poly[i]*poly[j];
}
}
double integral[2*n + 1]; // 平方後積分結果,忽略常數項
for(int i=0; i<=2*n; i++) { // 計算積分式
integral[i] = 1.0 * square[i] / (2*n + 1 - i);
}
double ans = 0.0; // 積分結果
int a, b; scanf("%d %d", &a, &b); // 積分下限、上限
for(int i=0; i<=2*n; i++) { // 代入積分下限、上限
ans += integral[i] * (pow(b, 2*n + 1 - i) - pow(a, 2*n + 1 - i));
}
printf("%.2f\n", 3.141592653589793*ans); // 印出答案時再乘以 pi
}
return 0;
}
沒有留言:
張貼留言