1038 一元三次方程求解 2001年NOIP全国联赛提高组
题目描述 Description
有形如:ax3+bx2+cx+d=0 这样的一个一元三次方程。给出该方程中各项的系数(a,b,c,d 均为实数),并约定该方程存在三个不同实根(根的范围在-100至100之间),且根与根之差的绝对值>=1。要求由小到大依次在同一行输出这三个实根(根与根之间留有空格),并精确到小数点后2位。
提示:记方程f(x)=0,若存在2个数x1和x2,且x1<x2,f(x1)*f(x2)<0,则在(x1,x2)之间一定有一个 根。
输入描述
Input Description
一个三次方程的各项系数
输出描述
Output Description
三个解
样例输入
Sample Input
1 -5 -4 20
样例输出
Sample Output
-2.00 2.00 5.00
数据范围及提示
Data Size & Hint
1 #include<queue> 2 #include<cstdio> 3 #include<cstring> 4 #include<iostream> 5 #include<algorithm> 6 using namespace std; 7 double a,b,c,d;int num=0; 8 double f(double x) 9 { 10 return a*x*x*x+b*x*x+c*x+d; 11 } 12 void dfs(double l,double r) 13 { 14 if((r-l)<=0.001) 15 { 16 printf("%.2lf ",l); 17 return; 18 } 19 double mid=(l+r)/2; 20 if(f(l)*f(mid)<=0)dfs(l,mid); 21 else dfs(mid,r); 22 } 23 int main() 24 { 25 scanf("%lf%lf%lf%lf",&a,&b,&c,&d); 26 for(int i=-100;i<100;i++) 27 { 28 double l=i,r=i+1; 29 if(f(l)==0) 30 printf("%.2lf ",l); 31 else if(f(l)*f(r)<0) 32 { 33 dfs(l,r); 34 num++; 35 } 36 if(num==3)break; 37 } 38 return 0; 39 }