Problem C: 求个积分 (I)
Time Limit: 1 Sec Memory Limit: 4 MB
Submit: 3278 Solved: 1745
[Submit][Status]
Description
如图所示,平面上有一椭圆,其中心在原点。求垂直于x轴的直线L、R与椭圆围成的封闭区域面积,即图中蓝色部分的面积。
Input
输入的第一个为整数N,表示接下来有N组测试数据。
从第二行开始,每行为一组测试数据,为四个实数a, b, l, r。其中,
a和b(0 < b < a)满足椭圆坐标方程
l和r表示直线L(x = l)和R(x = r)的坐标,并且-a <= l <= r <= a
Output
对于每一组测试数据,输出一浮点数代表封闭面积,小数点后保留三位有效数字,每一组输出占一行。
Sample Input
2
2 1 -2 2
2 1 0 2
Sample Output
6.283
3.142
HINT
求积分!!
Append Code
解法如下:
#include <stdio.h>
#include <math.h>
double f(double x, double a, double b) {
double result;
result = b / a * (x / 2 * (sqrt(a * a - x * x)) + a * a / 2 * asin(x / a));
return result;
}
int main() {
int num;
double t1, t2;
double a, b, l, r;
scanf("%d", &num);
while (num-- != 0)
{
scanf("%lf %lf %lf %lf", &a, &b, &l, &r);
t1 = fabs(l);
t2 = fabs(r);
if(l<=0&&r>=0)//两直线居两侧,直接面积相加
printf("%.3lf\n", 2 * f(t1, a, b) + 2 * f(t2, a, b));
else if(l>0||r<=0)//同一侧,面积相减
printf("%.3lf\n", fabs(2 * f(t2, a, b) - 2 * f(t1, a, b)));
}
}