题目地址:http://acm.hdu.edu.cn/showproblem.php?pid=1798
题意:给了你2个圆的坐标和半径,问2个圆相交的面积是多少
思路:注意要用公式求出来的pi,不然会造成精度问题,因为题目没有限定在哪一个范围内,给一个大神的题解地址写的很详细:http://blog.csdn.net/ice_crazy/article/details/7694090,用到了余弦定理,三角函数里面的参数是弧度制,返回值也是弧度制
AC代码:
#include <iostream> #include <cstdio> #include <cstdlib> #include <algorithm> #include <queue> #include <stack> #include <map> #include <cstring> #include <climits> #include <cmath> #include <cctype> const int inf = 0x3f3f3f3f;//1061109567 typedef long long LL; #define lson l,m,rt<<1 #define rson m+1,r,rt<<1|1 using namespace std; //const double pi = 3.1415926;用自己定义的pi有可能会造成精度问题,造成wrong,所以是用公式求出来 int main() { double pi =2*asin(1.0);//看到别人用这个求pi,学习一下,sin(pi/2)=1,所以通过这个式子就能得到pi,不会有精度问题 double a,b,c,x,y,z; while(scanf("%lf%lf%lf%lf%lf%lf",&a,&b,&c,&x,&y,&z) != EOF) { double cf = 0; double dis = sqrt((a-x)*(a-x)+(b-y)*(b-y)); if(dis>=c+z || !c || !z) { cf = 0; } else if(dis <= abs(c-z))//等于是内切,小于是内含 { double ll = min(c,z); cf = pi * ll * ll; } else { a = acos((c*c+dis*dis-z*z)/(2*dis*c));//圆o1 b = acos((z*z+dis*dis-c*c)/(2*dis*z)); //圆o1的扇形的面积 x = a*c*c; //圆o2的扇形的面积 y = b*z*z; //圆o1中的三角形的面积 double q = c*c*sin(a)*cos(a); //圆o2中的三角形的面积 double w = z*z*sin(b)*cos(b); cf = x + y -(q + w); } printf("%.3f\n",cf); } return 0; }