HDU 1798 Tell me the area

题目地址: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;
}


你可能感兴趣的:(HDU 1798 Tell me the area)