C++ 二分试根递归法求解一元三次方程 (递归,二分法)

问题描述

  有形如:ax3+bx2+cx+d=0 这样的一个一元三次方程。给出该方程中各项的系数(a,b,c,d 均为实数),并约定该方程存在三个不同实根(根的范围在-100至100之间),且根与根之差的绝对值>=1。要求三个实根。。

输入格式

  四个实数:a,b,c,d

输出格式

  由小到大依次在同一行输出这三个实根(根与根之间留有空格),并精确到小数点后2位

样例输入

1 -5 -4 20

样例输出

-2.00 2.00 5.00

数据规模和约定

  |a|,|b|,|c|,|d|<=10

代码如下

#include "iostream"
using namespace std;

//二分试根递归法求解一元三次方程

//得到试根的结果
double getResult(double a,double b,double c,double d,double x)
{
    return a*x*x*x+b*x*x+c*x+d;
}
void triEquals(double a,double b,double c,double d,double left,double right)
{
// 确定范围
    double l=left;
    double r= right;
//    最多试根1000次
    for(int i=0;i<1000;i++)
    {
//        得到中间根
        double middle=(l+r)/2;
//        试根
        double result= getResult(a,b,c,d,middle);
//        如果结果大于0,表示根在middle的左边
        if(result>0)
        {
            r=middle;
        }
//        否则在middle的右边
        else if(result<0)
        {
            l=middle;
        }
//        得到结果
        else
        {
//            输出实根
            cout<<r<<endl;
//            尝试根据r去寻找下一个根
//             在r左边的实体根
            triEquals(a,b,c,d,left,r-1);
//            在r右边的实体根
            triEquals(a,b,c,d,r+1,right);
//            结束
            break;
        }
    }
}

int main()
{
    double a,b,c,d;
    cin>>a>>b>>c>>d;
//    默认根的范围在=-100~100之间
    triEquals(a,b,c,d,-100,100);
    return 0;
}

猜你喜欢

转载自blog.csdn.net/weixin_53064820/article/details/129830778