思路:求积分。
辛普森公式
#include<iostream> #include<cstdio> #include<cstring> #include<cmath> #define eps 1e-8 using namespace std; double a,b; double F(double x) { return 2.0*b*sqrt(1.0-x*x/(a*a)); } double simpson(double l,double r) { double mid=l+(r-l)/2.0; return (r-l)*(F(l)+4.0*F(mid)+F(r))/6.0; } double inte(double l,double r,double sum) { double mid=l+(r-l)/2.0; double ls=simpson(l,mid); double rs=simpson(mid,r); if(abs(ls+rs-sum)<=eps)return sum; else return inte(l,mid,ls)+inte(mid,r,rs); } int main() { double l,r; int t; scanf("%d",&t); while(t--) { scanf("%lf%lf%lf%lf",&a,&b,&l,&r); double ans=inte(l,r,simpson(l,r)); printf("%.3f\n",ans); } return 0; }