题目:
看着这个图片,相信你已经猜出来了题意了吧,给你一个自然数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);
}
}
}
}