题意整理。

  • 给定一个圆类和一个点类。
  • 设计一个方法,判断点与圆的关系(圆内、圆上、圆外)。

方法一(模拟)

1.解题思路

  • 首先定义属性x1、y1用来记录p点的坐标,定义x2、y2用来记录圆心的坐标。通过坐标计算圆心到p点的距离的平方,记为dist。
  • 然后比较dist与半径平方的大小。如果距离dist小于半径平方,则在圆内;如果距离dist等于半径平方,则在圆上;如果距离dist大于半径平方,则在圆外。

图解展示: alt

2.代码实现

#include <iostream>
#include <math.h>
using namespace std;

// 点类
class Pointer {

    private:
        int x;  // x 坐标
        int y;  // y 坐标

    public:
        void setX(int x) {
            this->x = x;
        }

        int getX() {
            return x;
        }

        void setY(int y) {
            this->y = y;
        }

        int getY() {
            return y;
        }

};

// 圆类
class Circle {

    private:
        Pointer center; // 圆心
        int radius; // 半径

    public:
        void setCenter(int x, int y) {
            center.setX(x);
            center.setY(y);
        }

        void setRadius(int radius) {
            this->radius = radius;
        }

        // write your code here......
        void isPointerInCircle(Pointer p){
            int x1=p.getX();
            int y1=p.getY();
            int x2=center.getX();
            int y2=center.getY();
            int dist=(x1-x2)*(x1-x2)+(y1-y2)*(y1-y2);
            if(dist<radius*radius){
                cout<<"in"<<endl;
            }
            else if(dist==radius*radius){
                cout<<"on"<<endl;
            }
            else{
                cout<<"out"<<endl;
            }
        }

};

int main() {

    // 键盘输入点的坐标
    int x, y;
    cin >> x;
    cin >> y;

    // 创建一个点
    Pointer p;
    p.setX(x);
    p.setY(y);

    // 创建一个圆
    Circle c;
    c.setCenter(5, 0);
    c.setRadius(5);

    // 判断点和圆的关系
    c.isPointerInCircle(p);

    return 0;
}

3.复杂度分析

  • 时间复杂度:需要进行常数次操作,所以时间复杂度为O(1)O(1)
  • 空间复杂度:需要额外常数级别的空间,所以空间复杂度为O(1)O(1)