链接:https://www.nowcoder.com/acm/contest/115/F
来源:牛客网
时间限制:C/C++ 1秒,其他语言2秒
空间限制:C/C++ 32768K,其他语言65536K
64bit IO Format: %lld
空间限制:C/C++ 32768K,其他语言65536K
64bit IO Format: %lld
题目描述
对于方程 2018 * x ^ 4 + 21 * x + 5 * x ^ 3 + 5 * x ^ 2 + 14 = Y,
告诉你Y的值,你能找出方程在0~100之间的解吗?
告诉你Y的值,你能找出方程在0~100之间的解吗?
输入描述:
第一行输入一个正整数T(表示样例个数)
接下来T组样例
每组样例一行,输入一个实数Y
输出描述:
一行输出一个样例对应的结果,
输出方程在0~100之间的解,保留小数点后4位小数;如果不存在,输出 -1
输入例子:
2
1
20180421
输出例子:
-1
9.9993
-->
示例1
输入
2
1
20180421
输出
-1
9.9993
函数是递增的
二分的模板题,每次把区间一分为二,就是mid=(l+r)*1.0/2;然后算f(mid),如果刚好等于Y就输出,如果小于就取右边的区间继续算,否则取左边的
区间继续算。
#include<stdio.h>
#include<string.h>
double Y;
int t;
double f(double x)
{
return *x*x*x*x + *x + *x*x*x + *x*x +;//求导发现是递增的
}
double find(int a,int b)
{
double l=a;
double r=b;
if(f()>Y||f()<Y)//判断是否 无解
return -;
while(r-l>0.00001)//误差小于0.0001,我多加一个0没多大影响,还更精确
{
double mid=(l+r)/;
if(f(mid)<Y)
l=mid;
else if(f(mid)>Y)
r=mid;
else return mid;
}
return l;
}
int main()
{
scanf("%lld",&t);
while(t--)
{
scanf("%lfd",&Y);
double ans=find(,);
if(ans==-)
printf("%.0f\n",ans);
else
printf("%.4f\n",ans);
}
return ;
}