4424 等式(一元二次方程)

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



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)
		}
	}
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值