洛谷P1024 一元三次方程求解

题目描述

有形如: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)之间一定有一个根。

输入输出格式

输入格式:

一行,4个实数A,B,C,D。

输出格式:

一行,三个实根,并精确到小数点后2位。

输入输出样例

输入样例#1:
1 -5 -4 20
输出样例#1:
-2.00 2.00 5.00
分析:提示给的非常明显了,每次枚举两个端点,然后二分不断缩小区间,到一定范围就好了.
#include <cstdio>
#include <cstring>
#include <iostream>
#include <algorithm>
#include <cmath>

using namespace std;

double eps = 0.001;

double a,b,c,d;
int cnt;

double f(double x)
{
    return a * x * x * x + b * x * x + c * x + d;
}

int main()
{
    cin >> a >> b >> c >> d;
    for (double i = -100.0; i <= 100.0; i++)
    {
        double x = i,y = i + 1;
        if (cnt == 3)
        break;
        if (f(x) == 0)
        {
            printf("%.2lf ",x);
            cnt++;
            continue;
        }
        double l = f(x),r = f(y);
        if (l * r < 0)
        {
        while (y - x >= eps)
        {
            double mid = (x + y) / 2;
            double t = f(mid);
            if (t * f(x) < 0)
               y = mid;
            else
               x = mid;
        }
        printf("%.2lf ",x);
        cnt++;
    }
}
    
    return 0;
} 
 
原文地址:https://www.cnblogs.com/zbtrs/p/7478763.html