题目描述
对于方程 2018 * x ^ 4 + 21 * x + 5 * x ^ 3 + 5 * x ^ 2 + 14 = Y,
告诉你Y的值,你能找出方程在0~100之间的解吗?
输入描述:
第一行输入一个正整数T(表示样例个数)
接下来T组样例
每组样例一行,输入一个实数Y
输出描述:
一行输出一个样例对应的结果,
输出方程在0~100之间的解,保留小数点后4位小数;如果不存在,输出 -1
示例1
输入
2
1
20180421
输出
-1
9.9993
考察浮点数二分算法
浮点数二分算法模板
bool check(double x) {/* ... */} // 检查x是否满足某种性质
double bsearch_3(double l, double r)
{
const double eps = 1e-6; // eps 表示精度,取决于题目对精度的要求
while (r - l > eps)
{
double mid = (l + r) / 2;
if (check(mid)) r = mid;
else l = mid;
}
return l;
}
java
import java.util.Scanner;
public class Main{
public static void main(String []args){
Scanner sc=new Scanner(System.in);
int T=sc.nextInt();
while(T-->0){
double y=sc.nextDouble();
double l=0.0;
double r=100.0;
while(r-l>1e-5){
double mid=(r+l)/2;
if(2018*mid*mid*mid*mid+21*mid+5*mid*mid*mid+5*mid*mid+14>y){
r=mid;
}else{
l=mid;
}
}
if(0==l||r==100){
System.out.println(-1);
}else{
System.out.printf("%.4f\n",l);
}
}
}
}
c++
#include<iostream>
using namespace std;
int main()
{
int T;
cin>>T;
while(T--)
{
double y;
cin>>y;
double l=0,r=100;
double mid;
while(r-l>=1e-5)
{
mid=(r+l)/2;
if(2018*mid*mid*mid*mid + 21*mid + 5*mid*mid*mid + 5*mid*mid +14>y)
r=mid;
else
l=mid;
}
if(r==100||l==0)
{
printf("-1\n");
}
else
{
printf("%.4lf\n",mid);
}
}
return 0;
}