二分——解方程
题目描述
对于方程 2018 * x ^ 4 + 21 * x + 5 * x ^ 3 + 5 * x ^ 2 + 14 = Y,
告诉你Y的值,你能找出方程在0~100之间的解吗?
输入描述
第一行输入一个正整数T(表示样例个数)
接下来T组样例
每组样例一行,输入一个实数Y
输出描述
一行输出一个样例对应的结果,
输出方程在0~100之间的解,保留小数点后4位小数;如果不存在,输出 -1
示例
输入
2
1
20180421
输出
-1
9.9993
分析
由题意,我们可以得到 Y 的最大值为 201805052114,最小值为 14,因此,若输入的 Y 不在这个范围内的都是不存在的。而当 Y 存在时,我们可以通过二分来寻找使方程成立的 x。
#include<bits/stdc++.h>
using namespace std;
int main()
{
int t;
cin>>t;
while(t--){
double y;
cin>>y;
if(y>201805052114||y<14){
cout<<-1<<endl;
}
else{
double l=0,r=100,mid;
while(r-l>1e-5){
mid=(l+r)/2;
if(2018*mid*mid*mid*mid+21*mid+5*mid*mid*mid+5*mid*mid+14>y){
r=mid;
}
else{
l=mid;
}
}
printf("%.4lf\n",mid);
}
}
return 0;
}