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 }