1 条题解
-
0
C :
#include<stdio.h> #include<math.h> #define PI acos(-1.0) int main() { double x1,y1,r1,x2,y2,r2,a1,a2,dis,area; while(scanf("%lf%lf%lf%lf%lf%lf",&x1,&y1,&r1,&x2,&y2,&r2)!=EOF) { dis=sqrt((x1-x2)*(x1-x2)+(y1-y2)*(y1-y2));//两圆心之间的距离 if(r1+r2<=dis) //相离或相切 { printf("0.000\n"); continue; } if(fabs(r1-r2)>=dis) //包含 { printf("%.3lf\n",PI*(r1>r2?r2:r1)*(r1>r2?r2:r1)); continue; } //相交的情况 a1=(r1*r1+dis*dis-r2*r2)/(2*r1*dis);//余弦定理 a2=(r2*r2+dis*dis-r1*r1)/(2*r2*dis); a1=2*acos(a1); a2=2*acos(a2); area=r1*r1*(a1-sin(a1))/2+ r2*r2 * (a2 - sin(a2))/2; printf("%.3lf\n",area); } return 0; }
C++ :
#include <stdio.h> #include <math.h> const double eps = 1e-8; const double pi = acos(-1); double x[2], y[2], r[2]; double dis(double x1, double y1, double x2, double y2) { return sqrt((x1 - x2) * (x1 - x2) + (y1 - y2) * (y1 - y2)); } double fusiform(double a, double c, double b) { double angle = acos((a * a + b * b - c * c) / (2 * a * b)) * 2; double s1 = a * a * pi * (angle / (2 * pi)); double s2 = a * a * sin(angle) / 2; return s1 - s2; } double common(double x1, double y1, double r1, double x2, double y2, double r2) { double d = dis(x1, y1, x2, y2); if (d + eps >= r1 + r2) return 0; if (d - eps <= fabs(r1 - r2)) { if (r1 > r2) return pi * r2 * r2; else return pi * r1 * r1; } return fusiform(r1, r2, d) + fusiform(r2, r1, d); } int main() { while (scanf("%lf%lf%lf%lf%lf%lf", &x[0], &y[0], &r[0], &x[1], &y[1], &r[1]) != EOF) printf("%.3lf\n", common(x[0], y[0], r[0], x[1], y[1], r[1])); return 0; }
- 1
信息
- ID
- 2392
- 时间
- 1000ms
- 内存
- 32MiB
- 难度
- (无)
- 标签
- 递交数
- 0
- 已通过
- 0
- 上传者