思路是:首先求个导得到二次函数,由题可知Δ>0,故设两根为bound1,bound2,那么三次函数求根的区间就是[-100,bound1], [bound1,bound2],[bound2,100]分别进行二分求根。
#include<bits/stdc++.h>
#define eps 1e-4
using namespace std;
typedef long double ld;
ld a,b,c,d;
ld f(ld x)
{
return (a*x*x*x + b*x*x + c*x + d);
}
int main()
{
scanf("%Lf %Lf %Lf %Lf",&a,&b,&c,&d);
ld bound1 = (-b - sqrt(b*b-3*a))/(3*a), bound2 = (-b + sqrt(b*b-3*a))/(3*a);
ld getl[4] = {-100.0,bound1,bound2}, getr[4] = {bound1,bound2,100.0};
for(int i=0;i<3;i++)
{
ld l = getl[i], r = getr[i];
while(r-l>eps)
{
ld mid = (l+r)/2;
if(f(l)<0 && f(r)>=0)
{
if(f(mid)>=0) r = mid;
else l = mid;
}
else if(f(l)>=0 && f(r)<0)
{
if(f(mid)>=0) l = mid;
else r = mid;
}
}
printf("%.2LF ",l);
}
return 0;
}