为什么以下的两份代码一份 WA on #34,另一份 AC?
WA:
输入:
10000000 0 10000001
-10000000 0 10000000
答案:
4216.37028734199702739716
输出:
4216.38026992976665496826
#include <bits/stdc++.h>
using namespace std;
const long double pi = 3.14159265358979323846264338;
inline long double Dist(pair <long double, long double> c1, pair <long double, long double> c2)
{
return sqrtl((c1.first - c2.first) * (c1.first - c2.first) + (c1.second - c2.second) * (c1.second - c2.second));
}
pair <long double, long double> c1, c2;
long double r1, r2;
int main()
{
ios :: sync_with_stdio(0);
cin.tie(0), cout.tie(0);
cin >> c1.first >> c1.second >> r1 >> c2.first >> c2.second >> r2;
cout << fixed << setprecision(20);
if (r1 < r2) swap(c1, c2), swap(r1, r2);
long double dis = Dist(c1, c2);
if (dis >= r1 + r2) cout << 0.0 << endl;
else if (dis <= fabs(r2 - r1)) cout << pi * min(r1, r2) * min(r1, r2) << endl;
else
{
long double a1 = acosl((r1 * r1 + dis * dis - r2 * r2) / 2.0 / dis / r1);
long double a2 = acosl((r2 * r2 + dis * dis - r1 * r1) / 2.0 / dis / r2);
long double ss1 = r1 * r1 * a1;
long double ss2 = r2 * r2 * a2;
long double ch = r1 * sinl(a1);
cout << ss1 + ss2 - dis * ch << endl;
}
return 0;
}
AC:
#include <bits/stdc++.h>
using namespace std;
const long double pi = 3.14159265358979323846;
inline long double Dist(pair <long double, long double> c1, pair <long double, long double> c2)
{
return sqrtl((c1.first - c2.first) * (c1.first - c2.first) + (c1.second - c2.second) * (c1.second - c2.second));
}
pair <long double, long double> c1, c2;
long double r1, r2;
int main()
{
ios :: sync_with_stdio(0);
cin.tie(0), cout.tie(0);
cin >> c1.first >> c1.second >> r1 >> c2.first >> c2.second >> r2;
cout << fixed << setprecision(20);
if (r1 < r2) swap(c1, c2), swap(r1, r2);
long double dis = Dist(c1, c2);
if (dis >= r1 + r2) cout << 0.0 << endl;
else if (dis <= fabs(r2 - r1)) cout << pi * min(r1, r2) * min(r1, r2) << endl;
else
{
long double a1 = acosl((r1 * r1 + dis * dis - r2 * r2) / 2 / dis / r1);
long double a2 = acosl((r2 * r2 + dis * dis - r1 * r1) / 2 / dis / r2);
long double ss1 = r1 * r1 * a1;
long double ss2 = r2 * r2 * a2;
cout << ss1 + ss2 - r1 * r1 / 2 * sin(2 * a1) - r2 * r2 / 2 * sin(2 * a2) << endl;
}
return 0;
}