HDU 1724 Ellipse(数值积分の辛普森公式)

Problem Description
Math is important!! Many students failed in 2+2’s mathematical test, so let's AC this problem to mourn for our lost youth..
Look this sample picture:

HDU 1724 Ellipse(数值积分の辛普森公式)


A ellipses in the plane and center in point O. the L,R lines will be vertical through the X-axis. The problem is calculating the blue intersection area. But calculating the intersection area is dull, so I have turn to you, a talent of programmer. Your task is tell me the result of calculations.(defined PI=3.14159265 , The area of an ellipse A=PI*a*b )
 
Input
Input may contain multiple test cases. The first line is a positive integer N, denoting the number of test cases below. One case One line. The line will consist of a pair of integers a and b, denoting the ellipse equation  , A pair of integers l and r, mean the L is (l, 0) and R is (r, 0). (-a <= l <= r <= a).
 
Output
For each case, output one line containing a float, the area of the intersection, accurate to three decimals after the decimal point.
 
题目大意:给椭圆的a、b参数,求区间[l, r]的椭圆积分的和。
思路:直接套用辛普森公式,贴个模板。
 
代码(93MS):
 1 #include <cmath>

 2 #include <cstdio>

 3 #include <cstring>

 4 #include <algorithm>

 5 #include <iostream>

 6 using namespace std;

 7 

 8 double fa, fb, fl, fr;

 9 int n;

10 

11 double sqr(double x) {

12     return x * x;

13 }

14 

15 double func(double x) {

16     return  2 * sqrt(sqr(fb) * (1 - sqr(x) / sqr(fa)));

17 }

18 

19 double simpson(double a, double b) {

20     double mid = a + (b - a) / 2;

21     return (func(a) + 4 * func(mid) + func(b)) * (b - a) / 6;

22 }

23 

24 double asr(double a, double b, double eps, double A) {

25     double mid = a + (b - a) / 2;

26     double l = simpson(a, mid), r = simpson(mid, b);

27     if(fabs(l + r - A) <= 15 * eps) return l + r + (l + r - A) / 15;

28     return asr(a, mid, eps / 2, l) + asr(mid, b, eps / 2, r);

29 }

30 

31 double asr(double a, double b, double eps) {

32     return asr(a, b, eps, simpson(a, b));

33 }

34 

35 int main() {

36     scanf("%d", &n);

37     while(n--) {

38         scanf("%lf%lf%lf%lf", &fa, &fb, &fl, &fr);

39         printf("%.3f\n", asr(fl, fr, 1e-5));

40     }

41 }
View Code

 

你可能感兴趣的:(HDU)