一元三次方程求解

总时间限制: 
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
来源
NOIP2001复赛 提高组 第一题
 1 #include<bits/stdc++.h>
 2 using namespace std;
 3 const double eps=0.0001;
 4 double a,b,c,d;
 5 inline double calc(double x){
 6     double h=a*x*x*x+b*x*x+c*x+d;
 7     return h;
 8 }
 9 double ans[5];
10 inline void find(double,double);
11 int sum;
12 int main(){
13     scanf("%lf%lf%lf%lf",&a,&b,&c,&d);
14     for(int i=-101;i<=101;i++){
15         double tmp1=calc((double)i);
16         double tmp2=calc(double(i+1));
17         if(tmp1==0){
18             ans[++sum]=(double)i;
19         } 
20         else if(tmp2==0){
21             ans[++sum]=(double)(i+1);
22             i++;
23         } 
24         else if(tmp1*tmp2<0){
25             find((double)i,(double)i+1);
26         }
27         if(sum==3){
28             printf("%.2lf %.2lf %.2lf",ans[1],ans[2],ans[3]);
29             return 0;
30         }
31     }
32     
33     return 0;
34 }
35 inline void find(double l,double r){
36     if(r-l<=eps){
37         ans[++sum]=(l+r)/(double)2;
38         return ;
39     }
40     double mid=(l+r)/(double)2;
41     double tmp=calc(mid);
42     double tmpl=calc(l); 
43     double tmpr=calc(r);
44     if(tmp==0){
45         ans[++sum]=tmp;
46         return ;
47     }
48     else if(tmp*tmpl<0){
49         find(l,mid);
50     }
51     else if(tmp*tmpr<0){
52         find(mid,r);
53     }
54 }
原文地址:https://www.cnblogs.com/CXCXCXC/p/4903288.html