Get_V的A+B--------题解

题目:

emmmmmmmmmmmm
看着这个图片,相信你已经猜出来了题意了吧,给你一个自然数c,你需要找到两个非负数a、b使得a+b=c且a*b=c。

输入:

第一行t表示测试样例的个数(1≤t≤1000)
接下来的每一行包含一个整数c(0≤c≤10000)

输出:

如果有两个非负数使得a+b=c且ab=c成立,输出a和b,否则输出-1。若你的答案必须满足b≤a, |(a+b)-c|≤10^-6 且 |(ab)-c|≤10^-6.

范例输入:

10
2
7
10
3
57
18
333
860
4989
2147

范例输出:

-1
5.791287847 1.208712153
8.872983346 1.127016654
-1
55.981812167 1.018187833
16.937253933 1.062746067
331.996978824 1.003021176
858.998834497 1.001165503
4987.999799479 1.000200521
2145.999533799 1.000466201

思路:

其实这是一道数学题emmmmm
根据题意可得,a + b = c,那么 b = c - a,那么a * b = c可以表示为 a * ( c - a ) = c。
如果将方程展开就会变成 a² - c * a + c = 0。根据初中学的一元二次方程的解的公式,可以得到两个根分别为 x1 = [c + √(c² - 4c) ] / 2 和 x2 = [c - √(c² - 4c) ] / 2。
这样一来只需要知道一个c就能求出两个数字了,然后题目要求b<=a,显然 x2<=x1,因此只要分别输出x1 x2就好了。

#include<stdio.h>
#include<math.h>
const double eps = 1e-6;
int main()
{
	int T;
	while (~scanf("%d", &T))
	{
		while (T--)
		{
			int c;
			scanf("%d", &c);
			if (c*c < 4 * c)
				printf("-1\n");
			else
			{
				double x1 = (c + sqrt(c*c - 4 * c)) / 2.0;
				double x2 = (c - sqrt(c*c - 4 * c)) / 2.0;
				if (x1 < 0 || x2 < 0)//题目的要求是两个非负整数而且偏差不超过1e6,不过不限制精度似乎也能过emmmm
					printf("-1\n");
				else printf("%.9lf %.9lf\n", x1, x2);
			}
		}
	}
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值