这道题如果要解出来的话,除了要想到二分,更要想到枚举区间段为1的各部分,然后再注意注意细节就差不多了。
#include<bits/stdc++.h>
using namespace std;
double a,b,c,d;
int ans=0;
inline double f(double x)//定义好求值的函数
{
return a*x*x*x+b*x*x+c*x+d;
}
int main()
{
scanf("%lf %lf %lf %lf",&a,&b,&c,&d);
for(double i=-100;i<=99;i++)
{
if(ans>=3) break;//ans用于优化,因为题目中说了只有3个,所以当我们已经找到三个的时候可以直接退出
if(f(i)*f(i+1)<=0)//注意这里是<=因为有可能两端端点是零点
{
if(f(i)==0) printf("%.2f ",i),ans++;
else if(f(i+1)==0) printf("%.2f ",i+1),i++,ans++;
else{
double l=i;
double r=i+1;
double mid=(l+r)/2;
while(r-l>0.01)//精度为2位小数,说明这个区域范围要小于0.01
{
if(f(l)*f(mid)<=0)
{
r=mid;
}
else{
l=mid;
}
mid=(l+r)/2;
}
printf("%.2f ",mid);
ans++;
}
}
}
}
京公网安备 11010502036488号