SMPCIRC-两个圆圈

时间:2018-10-04 15:36:14

标签: c++

我不知道我在哪里出错 它适用于示例,但结果显示“错误答案”

问题:

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

2 个答案:

答案 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

还在每个输出之后打印新行。