1. 程式人生 > >Ellipse HDU - 1724(自適應辛普森積分)

Ellipse HDU - 1724(自適應辛普森積分)

img display 一個 blank c++ can 過程 遞歸 for

Ellipse

HDU - 1724 emmm...快比賽了先補幾個模板~ 自適應辛普森積分 技術分享
 1 #include <bits/stdc++.h>
 2 using namespace std;
 3 const double eps = 1e-5;
 4 double a, b, l, r;
 5 
 6 double F(double x) {
 7     //Simpson公式用到的函數
 8     return sqrt((a * a * b * b - b * b * x * x) / a / a);
 9 }
10 double simpson(double
a, double b) { //三點Simpson法,這裏要求F是一個全局函數 11 double c = a + (b - a) / 2; 12 return (F(a) + 4 * F(c) + F(b))*(b - a) / 6; 13 } 14 double asr(double a, double b, double eps, double A) { //自適應Simpson公式(遞歸過程)。已知整個區間[a,b]上的三點Simpson值A 15 double c = a + (b - a) / 2; 16 double L = simpson(a, c), R = simpson(c, b);
17 if (fabs(L + R - A) <= 15 * eps)return L + R + (L + R - A) / 15.0; 18 return asr(a, c, eps / 2, L) + asr(c, b, eps / 2, R); 19 } 20 double asr(double a, double b, double eps) { 21 return asr(a, b, eps, simpson(a, b)); 22 } 23 24 25 int main(){ 26 int n; 27 //freopen("in.txt", "r", stdin);
28 scanf("%d", &n); 29 for(int i = 0; i < n; i++){ 30 scanf("%lf %lf %lf %lf", &a, &b, &l, &r); 31 printf("%.3lf\n", 2 *asr(l, r, eps)); 32 } 33 }
View Code

Ellipse HDU - 1724(自適應辛普森積分)