题目描述 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
思路分析:二分第一次
Source:
1 #include <iostream> 2 #include <cstdio> 3 #include <cmath> 4 using namespace std; 5 double a,b,c,d; 6 double fc(double x) 7 { 8 return (a*pow(x,3)+b*pow(x,2)+c*x+d); 9 } 10 void twod(double x1,double x2) 11 { 12 double x3,y1,y2,y3; 13 x3=(x1+x2)/2.0; 14 y1=fc(x1); 15 y2=fc(x2); 16 y3=fc(x3); 17 if ((y3==0) || ((y1*y2<0) && (x1+0.001>x2))) 18 { 19 printf("%.2lf%c",x3,' '); 20 return; 21 } 22 if ((y1*y3<0) || (x3-x1>1)) 23 twod(x1,x3); 24 if ((y3*y2<0) || (x2-x3>1)) 25 twod(x3,x2); 26 } 27 int main() 28 { 29 scanf("%lf%lf%lf%lf",&a,&b,&c,&d); 30 twod(-100,100); 31 }