1038 一元三次方程求解

1038 一元三次方程求解

2001年NOIP全国联赛提高组

时间限制: 1 s
空间限制: 128000 KB
题目等级 : 白银 Silver
 
 
 
题目描述 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<iostream>
 2 #include<cstdio>
 3 using namespace std;
 4 double f(double);
 5 double a,b,c,d;
 6 int main()
 7 {
 8     double x1,x2,xx;
 9     cin>>a>>b>>c>>d;
10     for(int x=-100;x<=100;x++)
11      {
12          x1=x;
13          x2=x+1;
14          if(f(x1)==0)printf("%.2lf ",x1);
15          if(f(x1)*f(x2)<0)
16           {
17               while(x2-x1>=0.001)
18                {
19                    xx=(x2+x1)/2;
20                    if(f(x1)*f(xx)<=0)
21                     x2=xx;
22                     else x1=xx;
23                }
24               printf("%.2lf ",x1); 
25           }
26      }
27      cout<<endl;
28 }
29 double f(double x)
30 {
31     return x*x*x*a+x*x*b+x*c+d;
32 }

 

posted @ 2017-03-24 18:50  ioioioioioio  阅读(326)  评论(3编辑  收藏  举报