一元三次方程的解

题目:

https://www.luogu.com.cn/problem/P1024

题目描述

有形如:a x^3 + b x^2 + c x + d = 0ax3+bx2+cx+d=0 这样的一个一元三次方程。给出该方程中各项的系数(a,b,c,da,b,c,d 均为实数),并约定该方程存在三个不同实根(根的范围在 -100100 至 100100 之间),且根与根之差的绝对值 \ge 11。要求由小到大依次在同一行输出这三个实根(根与根之间留有空格),并精确到小数点后 22 位。

提示:记方程 f(x) = 0f(x)=0,若存在 22 个数 x_1x1 和 x_2x2,且 x_1 < x_2x1<x2f(x_1) \times f(x_2) < 0f(x1)×f(x2)<0,则在 (x_1, x_2)(x1,x2) 之间一定有一个根。

 

 

确定单调区间然后二分

#include<iostream>
#include<cstdio>
#include<queue>
using namespace std;
double eps=1e-4;
double a,b,c,d;
double f(double x)
{
    return a*x*x*x+b*x*x+c*x+d;
}
int main()
{   queue<double> q;
    scanf("%lf %lf %lf %lf",&a,&b,&c,&d);

    for(double i=-100;i<100;i++)
    {
        double x1=i,x2=i+1;

        if(f(x1)==0)
        {q.push(x1);
        }
        else if(f(x1)*f(x2)<0)
        {
                double l=x1,r=x2;
        while(r-l>=eps)
        {
            double mid=(r+l)/2;
            if(f(mid)*f(r)<0)
            {
                l=mid;
            }
            else
                r=mid;
        }
        q.push(r);
        }
        if(q.size()==3)
            break;

    }
    printf("%.2lf",q.front());
    q.pop();
    while(!q.empty())
    {
          printf(" %.2lf",q.front());
             q.pop();
    }
}

 

posted @ 2021-07-15 09:58  废柴废柴少女  阅读(546)  评论(0)    收藏  举报