我不知道我在哪里出错 它适用于示例,但结果显示“错误答案”
问题:
https://www.spoj.com/problems/SMPCIRC/
SMPCIRC-两个圆圈
平面几何#基本
给出两个圆:中心为o1 =(xo1,yo1)且半径为r1的O1 和O2,中心为o2 =(xo2,yo2),半径为r2,请计算 如果O1在O2内,或者O2在O1内。
输入描述首先t <1000,测试用例数。在每个 以下t行是6个整数:xo1 yo1 r1 xo2 yo2 r2。 0≤ xo1,yo1,xo2,yo2≤10000且0
输出说明对于每个测试用例,请打印一个字符:I,如果O1为 在O2内部(或如果O2在O1内部),则E,如果O1在内部切线到 O2(或者O2在内部与O1相切),在其他情况下为O。
示例
输入:2 103 104 5 100 100 10 103 104 10 100 100 10
输出:E O
我的代码:
#include <iostream>
#include <cmath>
using namespace std;
int main()
{
int t;
cin>>t;
for(int i=0;i<t;i++)
{
double x1, y1, r1, x2, y2, r2, dl;
cin>>x1>>y1>>r1>>x2>>y2>>r2;
dl=sqrt(pow(x2-x1,2) + pow(y2-y1,2));
if(dl+r1==r2)
cout<<"E";
else if(dl+r2==r1)
cout<<"E";
else if (dl+r1<r2)
cout<<"I";
else if(dl+r2<r1)
cout<<"I";
else
cout<<"O";
}
return 0;
}
答案 0 :(得分:0)
使用浮点类型时,将出现一定数量的数字错误。有时候对于我们要解决的问题来说,这可能是无法接受的。
OP问题中的引号清楚地表明输入的变量是(强调我的)
6 整数:xo1 yo1 r1 xo2 yo2 r2。其中0≤xo1,yo1,xo2,yo2≤10000和0
鉴于基本数学问题的性质,使用整数变量进行计算也很安全,只需应用一点代数:
#include <iostream>
constexpr long int square(long int x)
{
return x * x;
}
int main()
{
int t;
// Usually, the input is well defined in this kind of assignments
std::cin >> t;
for(int i=0; i < t; i++)
{
long int x1, y1, r1, x2, y2, r2;
std::cin >> x1 >> y1 >> r1 >> x2 >> y2 >> r2;
// Calculte the square of the distance
long int d2 = square(x2 - x1) + square(y2 - y1);
// Instead of d == r2 - r1, check if d^2 == (r2 - r1)^2
long int dr21 = square(r2 - r1);
if ( d2 > dr21 )
std::cout << "O\n";
else if ( d2 < dr21 )
std::cout << "I\n";
else // This is probably the least likely case
std::cout << "E\n";
}
return 0;
}
答案 1 :(得分:-1)
您不应使用==运算符来比较两个双精度值。采用
fabs(a - b) < eps
代替==运算符。您可以选择eps = 1e-7
。
还在每个输出之后打印新行。