一元三次方程求解

【题目描述】

有形如:ax3+bx2+cx+d=0  这样的一个一元三次方程。

给出该方程中各项的系数(a,b,c,d  均为实数),并约定该方程存在三个不同实根(根的范围在-100至100之间),且根与根之差的绝对值>=1。要求由小到大依次在同一行输出这三个实根(根与根之间留有空格),并精确到小数点后2位。

【输入格式】

一行,包含四个实数a,b,c,d,相邻两个数之间用单个空格隔开。

【输出格式】

一行,包含三个实数,为该方程的三个实根,按从小到大顺序排列,相邻两个数之间用单个空格隔开,精确到小数点后2位。

【分析】

简单的分治算法,每一次找出相邻的两个数,在每次缩小范围就可以了。

【代码】

 1 #include<bits/stdc++.h>
 2 
 3 using namespace std;
 4 
 5 double a,b,c,d,x,xx,x1,x2;
 6 
 7 double calc(double n){
 8     return a*n*n*n+b*n*n+c*n+d;
 9 }
10 
11 int main()
12 {
13     scanf("%lf%lf%lf%lf",&a,&b,&c,&d);
14     for(int x=-100;x<=100;x++){
15         x1=x;
16         x2=x+1;
17         if(calc(x)==0)printf("%.2lf ",x1);
18         else if(calc(x1)*calc(x2)<0){
19             while(x2-x1>=0.001){
20                 xx=(x1+x2)/2;
21                 if(calc(x1)*calc(xx)<=0)x2=xx;
22                 else x1=xx;
23             }
24             printf("%.2lf ",x1);
25         }
26     }
27     return 0;
28 }

猜你喜欢

转载自www.cnblogs.com/Dawn-Star/p/9114906.html