P1024一元三次方程求解

思路:
1.[-100,100]的枚举左端点
2.如果左右端点的函数值乘积小于0,说明[l,r]内有根,进行二分
3.向左找
4.当集齐3个答案之后,输出
#define EPI 1e-4
double a,b,c,d,x[5];//x[idx]
double l,r,mid,mvalue;//mid-value
int idx;//记录答案的x数组的下标
double f(double x)
{
return a*x*x*x+b*x*x+c*x+d;
}
int main()
{
cin>>a>>b>>c>>d;
for(l=-100;l<=100&&idx<3;++l)
{
r=l+1;
if(f(l)==0)
{
x[++idx]=l;
continue;
}
if(f(l)*f(r)<0){//向左找
while((r-l)>EPI)
{
mid=(l+r)/2;
mvalue=f(mid);
if(f(l)*mvalue<0)
r=mid;
else
l=mid;
}
x[++idx]=l;
}
}
sort(x+1,x+idx+1);
for(int i=1;i<=idx;++i)
printf("%.2lf ",x[i]);
return 0;
}

浙公网安备 33010602011771号