这道题如果要解出来的话,除了要想到二分,更要想到枚举区间段为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++;

            }
        }
    }

}