气氛突然苏维埃

题目描述:

你将获得一个非负整数d。你将获得两个非负整数a,b使得a+b=d && a*b = d
输入
输入第一行t表示有t组数据。(1≤t≤103)
接下来的t组数据每组包含一个整数d。(0≤d≤103)
输出
每一组数据如果有对应的a和b 第一个输出‘Y’ or ‘N’ 第二个输出a 第三个输出b,保留九位小数
样例输入
7
69
0
1
4
5
999
1000
样例输出
Y 67.985071301 1.014928699
Y 0.000000000 0.000000000
N
Y 2.000000000 2.000000000
Y 3.618033989 1.381966011
Y 997.998996990 1.001003010
Y 998.998997995 1.001002005

分析:

本题诈一看很难,难到我一开始想到了二分查找去了。后经过分析,我们可以将给出的两个等式,化为一个方程,在用方程的求根公式来求出。

#include"stdio.h"
#include"math.h"
int main()

{
    long long t,d;
    double x,y,m;
    while(~scanf("%lld",&t))
    {
        while(t--)
        {
            scanf("%lld",&d);
            m=sqrt(d*d-4.0*d);
            x=(d-m)/2;y=d-x;
            if(x>=0&&y>=0)
            {


                printf("Y %.9lf %.9lf\n",y,x);
                continue;
            }
            x=(d+m)/2;y=d-x;
            if(x>=0&&y>=0)
            {
                printf("Y %.9lf %.9lf\n",y,x);
                continue;
            }
            printf("N\n");

        }
    }
}

猜你喜欢

转载自blog.csdn.net/qq_43506138/article/details/84564424