题目描述
有形如:ax3+bx2+cx+d=0 这样的一个一元三次方程。给出该方程中各项的系数(a,b,c,d 均为实数),并约定该方程存在三个不同实根(根的范围在-100至100之间),且根与根之差的绝对值>=1。要求三个实根。。
数据规模和约定
|a|,|b|,|c|,|d|<=10
输入
四个实数:a,b,c,d
输出
由小到大依次在同一行输出这三个实根(根与根之间留有空格),并精确到小数点后2位
样例输入
1 -5 -4 20
样例输出
-2.00 2.00 5.00
#include<stdio.h>
#include<math.h>
const double InfinitelySmall = 0.000001;
double A, B, C, D;
double Function( double X )
{
return A * pow( X, 3 ) + B * pow( X, 2 ) + C * X + D;
}
double Root( double Left, double Right )//Left,Right为区间端点
{
if( Right - Left < InfinitelySmall ) return ( Left + Right ) / 2;
else
{
double Y1, Y2, Y3;
Y1 = Function( Left );
Y2 = Function( ( Left + Right ) / 2 );
Y3 = Function( Right );
if( Y2 == 0 ) return ( Left + Right ) / 2;
else if( Y1 * Y2 < 0 ) return Root( Left, ( Left + Right ) / 2 );
else Root( (( Left + Right ) / 2 ), Right );
}
}
int main( int argc, char **argv )
{
double X1, X2;//X1,X2为导函数两个根
scanf( "%lf%lf%lf%lf", &A, &B, &C, &D );
if( A < 0 )
A = -A, B = -B, C = -C, D = -D;
X1 = ( -2 * B - sqrt( 4 * pow( B,2 ) - 12 * A *C )) / ( 6 * A );
X2 = ( -2 * B + sqrt( 4 * pow( B,2 ) - 12 * A *C )) / ( 6 * A );
printf( "%.2f %.2f %.2f\n", Root( -100, X1 ), Root( X1, X2 ), Root( X2, 100 ) );
return 0;
}