hdu1724 自適應辛普森積分 求面積 定積分
阿新 • • 發佈:2018-12-16
#include <iostream> #include <cstdio> #include <cstring> #include <cstdlib> #include <cmath> using namespace std; const double eps = 1e-6;//eps是整個辛普森應用的關鍵,取的大小根據題目要求的精度來確定,如果取的太小,會導致遞迴次數太多TLE int T; double a,b,l,r; double f(double x) //定義函式 { return b * sqrt(1 - x * x / (a * a)); } double simpson(double a, double b) //返回區間[a,b]的三點辛普森值 { double c = (a + b) / 2; return (f(a) + 4 * f(c) + f(b)) * (b-a) / 6; } double asr(double a, double b, double eps) { double mid = (a + b) / 2; double L = simpson(a, mid), R = simpson(mid, b), S = simpson(a, b); if (fabs(S - L - R) <= 15 * eps) return L + R + (S - L - R) / 15; return asr(a, mid, eps /2) + asr(mid, b, eps / 2); } int main() { scanf("%d", &T); while (T--) { scanf("%lf%lf%lf%lf", &a, &b, &l, &r); printf("%.3f\n", 2 * asr(l, r, eps)); } }