HDOJ 题号 (2199)
题目大意:鉴于方程8*x^4 + 7*x^3 +2*x^2 + 3*x + 6 = Y,在 0 和 100 之间找到其解决方案;
解题思路:题目中的方程是单调递增的,符合二分法的条件;当x=0时为最小值,当x=100时为最大值,如果Y在最小值和最大值之间,说明有解,否则无解,有解时根据判断Y与中间值的比较,依次缩小范围,最早求出解。
代码:
#include<iostream>
#include<algorithm>
#include<cmath>
using namespace std;
double fun(double x)
{
return 8*pow(x,4)+7*pow(x,3)+2*pow(x,2)+3*x+6;
}
int main()
{
double y,low,high,mid,answer;
int n;
cin>>n;
while(n--)
{
cin>>y;
if(y>=fun(0)&&y<=fun(100))
{
low=0;
high=100;
while(high-low>1e-7)
{
mid=(low+high)/2.0;
answer=fun(mid);
if(answer>y)
high=mid-1e-7;
else
low=mid+1e-7;
}
printf("%.4f\n",(low+high)/2);
}
else
cout<<"No solution!"<<endl;
}
return 0;
}
遇到的问题:开始时将1e-6写成了1e6,改正后发现精度存在问题,又将1e-6改成1e-7