题目描述:
有形如:f(x)=ax^3+bx^2+cx+d=0这样的一元三次方程,给出该方程中各项的系数a,b,c,d,它们均为实数,并约定该方程一定存在着3个不同的实数解,解的范围在-100至100之间,且解与解之差的绝对值≥1。
现在请你编程,由小到大依次输出这三个实根,并精确到小数点后2位。
输入:
一行4个实数,每两个数之间用1个空格隔开,分别表示a,b,c,d。
1 -5 -4 20
输出:
一行3个实数,分别表示3个实根,每两个之间用1个空格隔开。注意由小到大
-2.00 2.00 5.00
提示:
记方程f(x)=0,若存在2个数x1和x2,且x1<x2,如果f(x1)*f(x2)<0,则在(x1,x2)之间一定有一个解。
所以就直接将解扩大100倍从-100到100进行枚举如果在 i 到 i-1间有f(i)*f(i-1)<0那就说明在i到i-1之间一定有一个解,然后用二分查找解即可。
注意:所有变量都要用double,不然会出错,包括数组的变量。
代码如下:
#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
#include<cmath>
#include<iomanip>
using namespace std;
double a,b,c,d;
double f(double x)
{
return(x*x*x*a+x*x*b+x*c+d);
}
double ans[];
double bsearch(double l,double r)
{
if(r-l<=0.001)
return l;
double mid=(l+r)/;
if(f(l)*f(mid)<=)
return bsearch(l,mid);
else
return bsearch(mid,r);
}
int main()
{
cin>>a>>b>>c>>d;
int ci=;
for(int i=-;i<=;i++)
{
double l=i,r=i+;
if(f(l)==)
ans[++ci]=l;
else
{
if(f(l)*f(r)<)
{
ans[++ci]=bsearch(l,r);
}
}
if(ci>=)
break;
}
cout<<setiosflags(ios::fixed)<<setprecision();
cout<<ans[]<<' '<<ans[]<<' '<<ans[]<<endl;
return ;
}