分治5--一元三次方程求解
一、心得
一定要先想清楚,套路是固定的
如果有位置不懂,就举例子举出来吧
先说明等于的情况
然后再是不等于的情况
二、题目及分析
一元三次方程求解
总时间限制: 1000ms 内存限制: 65536kB
描述
有形如:ax3+bx2+cx+d=0 这样的一个一元三次方程。
给出该方程中各项的系数(a,b,c,d 均为实数),并约定该方程存在三个不同实根(根的范围在-100至100之间),且根与根之差的绝对值>=1。要求由小到大依次在同一行输出这三个实根(根与根之间留有空格),并精确到小数点后2位。
输入
一行,包含四个实数a,b,c,d,相邻两个数之间用单个空格隔开。
输出
一行,包含三个实数,为该方程的三个实根,按从小到大顺序排列,相邻两个数之间用单个空格隔开,精确到小数点后2位。
样例输入
1.0 -5.0 -4.0 20.0
样例输出
-2.00 2.00 5.00
三、代码及结果
1 /* 2 如果有位置不懂,就举例子举出来吧 3 4 */ 5 #include <iostream> 6 using namespace std; 7 8 double a,b,c,d; 9 double f(double x){ 10 double f=a*x*x*x+b*x*x+c*x+d; 11 return f; 12 } 13 14 //枚举法 从-100,-99.99,...,一直枚举到100 15 void findAns(){ 16 cout<<"枚举:"<<endl; 17 for(double x=-10000;x<=10000;x++){//10000是为了方便x++,也可(x/100)++ 18 double x1=x/100-0.005,x2=x/100+0.005; 19 //if(f(x1)*f(x2)<=0)//有错 在99.99的时候,有99.985; 和99.98的时候,也有99.985, 20 // 如果是99.985,那 99.99和99.98都成立 21 if(f(x1)*f(x2)<0||f(x1)==0) 22 printf("%.2f ",x/100); 23 } 24 cout<<endl; 25 } 26 27 //分治 28 //这个之前写的有问题 29 void findAns2(){ 30 cout<<"分治:"<<endl; 31 for(double x=-100;x<=100;x++){ 32 double x1=x,x2=x+1; 33 //先输出等于的情况 34 if(f(x1)==0) printf("%.2f ",x1); 35 else if(f(x1)*f(x2)<0){//符合条件 36 while(x2-x1>=0.001){ 37 double mid=(x1+x2)/2; 38 if(x1*mid<=0) x2=mid; 39 else x1=mid; 40 } 41 printf("%.2f ",x1); 42 } 43 44 } 45 cout<<endl; 46 } 47 48 int main(){ 49 cin>>a>>b>>c>>d; 50 findAns(); 51 findAns2(); 52 return 0; 53 }