求两数和等于两数积(二分)

求两数和等于两数积(二分)

题意:  给一个测试次数 t  每行输入一个数,输入t行d

    0<=t<=3000,    0<=d<=3000

    使|(a+b)ab|106    and    |(a+b)d|106

注意:精度用1e-7 及可AC

#include <cstdio>
#include <cstring>
#include <iostream>
#include <algorithm>
 
using namespace std;

int main() {
    int t;
    cin>>t;
    while( t-- ) {
        double N;
        cin>>N;
        double l = 0.0, r =  N, mid, eps = 1e-7;
        int count = 0, flag = 1;
        while( true ) {
            mid = ( r + l) / 2.0;
            double a = N - mid, b = mid;
            double T = ( a + b  )  - ( a * b );
//            cout<<"mid = "<<mid<<endl;
            if( T >= -eps && T <= eps) break;
            if( T < -eps  ){
                l = mid;
            } 
            if( T > eps ) {
                r = mid;
            }
            count++;
            if(count ==100) {
                flag = 0; 
                break;
            }
        }
        if(flag)
            printf("Y %.9lf %.9lf\n",mid,N-mid);
        else 
            printf("N\n");
    }

    return 0;
}
//Input
//7
//69
//0
//1
//4
//5
//999
//1000
//Output
//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
 

 

posted @ 2019-03-09 10:57 峰寒 阅读( ...) 评论( ...) 编辑 收藏
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值