0
点赞
收藏
分享

微信扫一扫

HDU 1798 Tell me the area


题目地址:http://acm.hdu.edu.cn/showproblem.php?pid=1798

题意:给了你2个圆的坐标和半径,问2个圆相交的面积是多少

思路:注意要用公式求出来的pi,不然会造成精度问题,因为题目没有限定在哪一个范围内,给一个大神的题解地址写的很详细:0,用到了余弦定理,三角函数里面的参数是弧度制,返回值也是弧度制

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;
}



举报

相关推荐

0 条评论