用两个扇形的面积减去一个四边形的面积就是两圆相交的面积。
海伦公式,扇形的面积公式==(|a|*r*r)/2。
题目要求只需要保留整数部分,所以不需要精确算出来具体的值。
#include<iostream> #include<cstring> #include<cstdio> #include<queue> #include<algorithm> #include<cmath> #define pi 3.1415926 using namespace std; double intersect(double r1,double r2,double l){//求两圆的相交面积 double s,p,ans; if(l>=r1+r2) ans=0; else if(l<=abs(r1-r2)){ if(r1<=r2) ans=pi*r1*r1; else ans=pi*r2*r2; } else{ p=(l+r1+r2)/2; s=2*sqrt(p*(p-l)*(p-r1)*(p-r2)); if(r1>r2){ swap(r1,r2); } ans=acos((r1*r1+l*l-r2*r2)/(2*r1*l))*r1*r1+acos((r2*r2+l*l-r1*r1)/(2*r2*l))*r2*r2-s; } return ans; } int main() { double r1,r2,s; int T,x; scanf("%d",&T); while(T--){ scanf("%lf%lf%lf",&r1,&r2,&s); double l=0.0,r=r1+r2,mid; while(l<r){ mid=(l+r)/2; double temp=intersect(r1,r2,mid); if((int)r==int(l)){//整数部分相同时 x=int(r); break; } else if(temp>s) l=mid; else r=mid; } printf("%d\n",x); } return 0; }