这个问题的解决方案基于几何和二次方程的知识。首先,我们知道圆和坐标轴相切,所以圆心必然在坐标轴的正方向上。其次,圆经过给定的点P,所以点P到坐标原点的距离等于圆的半径。
我们可以通过解二次方程来找到满足这些条件的圆的半径。具体来说,我们设圆的半径为r,那么根据点P的坐标和圆心的坐标,我们可以得到一个二次方程:(r−x)2+(r−y)2=r2,其中x和y是点P的坐标。
这个二次方程的解就是可能的圆的半径。我们可以使用二次方程的求根公式来求解这个方程,得到两个解。然后,我们按照从小到大的顺序输出这两个解,就得到了最终的答案。
C++
#include <bits/stdc++.h>
using namespace std;
int main() {
double x, y; std::cin >> x >> y;
double a = 1, b = -2 * (x + y), c = x * x + y * y;
double r1 = (-b + std::sqrt(std::pow(b, 2) - 4 * a * c)) / (2 * a);
double r2 = (-b - std::sqrt(std::pow(b, 2) - 4 * a * c)) / (2 * a);
std::cout << std::fixed << std::setprecision(6) << r2 << " " << r1 << std::endl;
}
Java
import java.util.*;
class Main{
public static void main(String[]args){
Scanner sc=new Scanner(System.in);
int x=sc.nextInt();
int y=sc.nextInt();
double m1=0.000001;
double a=1.0*x;
double b=1.0*y;
double w=a+b;
double r=2*a*b;
double sub=r;
double l=0;
double mid=Math.sqrt(r);
l=w-mid;
r=w+mid;
System.out.print(l+" "+r);
}
}
Python
import math
x, y = map(float, input().split())
a = 1
b = -2 * (x + y)
c = x * x + y * y
r1 = (-b + math.sqrt(b**2 - 4*a*c)) / (2 * a)
r2 = (-b - math.sqrt(b**2 - 4*a*c)) / (2 * a)
print("{:.6f} {:.6f}".format(min(r1, r2), max(r1, r2)))
小红在平面直角坐标系中确定了一点 P,他希望构造一个满足以下条件的圆:
小红预测出会有两个合法解,请你从小到大输出这两个合法解的圆的半径。
两个正整数 x 和 y,表示点 p 的坐标。
1≤x,y≤105
从小到大输出两个浮点数,分别代表两个合法解的圆的半径。在此题中,如果你的答案和标准答案的差值在 10−6,那么你的答案是正确的。
1 2
1.0000 5.0000
2 3
1.535898 8.464102