问题 V 一元三次方程求解

题目描述
  有形如: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;

}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值