1. 问题描述:
给定一个非负整数 d,请你找到两个非负实数 a,b,使得等式 a + b = d 和 a × b = d 同时成立
输入格式
第一行包含整数 T,表示共有 T 组测试数据,每组数据占一行,包含一个整数 d
输出格式
每组数据输出一行答案:
如果存在满足条件的 a 和 b,则首先输出一个字母 Y,随后输出任意一组满足要求的 a 和 b;
如果不存在满足条件的 a 和 b,则输出一个字母 N;
只要你输出的 a 和 b 能够同时满足 |(a + b) − a × b| ≤ 10 ^ −6 以及 |(a + b) − d| ≤ 10 ^ −6,就视为正确,为了保证精度,建议输出结果保留10位小数;
数据范围
前三个测试点满足 1 ≤ T ≤ 10
所有测试点满足 1 ≤ T ≤ 1000,0 ≤ d ≤ 1000
输入样例:
10
0
1
2
3
4
5
6
7
8
9
输出样例:
Y 0.0000000000 0.0000000000
N
N
N
Y 2.0000000000 2.0000000000
Y 3.6180339754 1.3819660246
Y 4.7320508212 1.2679491788
Y 5.7912878394 1.2087121606
Y 6.8284271359 1.1715728641
Y 7.8541019708 1.1458980292
来源:https://www.acwing.com/problem/content/4427/
2. 思路分析:
分析题目可以知道两个方程两个未知数是可以求解的,令 a = x,则 b = d - x,代入之后可以得到一元二次方程:x ^ 2 - dx + d = 0,我们可以使用求根公式求解方程的两个解如下图所示,当 d * d - 4 * d < 0 的时候方程无解,此时 d < 4,而对于 d = 0 方程是有解的,a = b = 0,所以当 d = 0 的时候 a = b = 0;当 d != 0 且 d < 4 的时候方程无解;当 d >= 4 的时候使用求根公式求解最终结果保留 10 位小数即可:
3. 代码如下:
python:
import math
class Solution:
def process(self):
T = int(input())
for i in range(T):
d = float(input())
if d == 0:
print("Y 0 0")
elif d < 4:
print("N")
else:
dt = math.sqrt(d * d - 4 * d)
# 使用format函数保留10位小数格式化输出
print("Y {:.10f} {:.10f}".format((d + dt) / 2, (d - dt) / 2))
if __name__ == '__main__':
Solution().process()
go:
package main
import (
"fmt"
"math"
)
func main() {
var T int
var d float64
fmt.Scan(&T)
for i := 0; i < T; i++ {
fmt.Scan(&d)
if d == 0 {
fmt.Println("Y 0 0")
} else if d < 4 {
fmt.Println("N")
} else {
dt := math.Sqrt(d*d - 4*d)
fmt.Printf("Y %.10f %.10f\n", (d+dt)/2, (d-dt)/2)
}
}
}