欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

Luogu P1024题解

程序员文章站 2022-05-09 10:05:07
...

题目描述:
对于一个一元三次方程,我们给出各个项的系数,现在需要你找出这个一元三次方程的三个根,保证根的大小-100~100且根于根之间差的绝对值大于1。
题解:
已经知道了每个根的限制条件,我们就可以把-100~100这个区间按区间长度1来分,每个区间上二分查询一次答案,这里注意,我们是在实数域上进行二分,所以要有精度的要求。题中说明结果取小数点后2位,那么我们放到后三位即可。
AC代码:

#include<iostream>
#include<cstdio>
#include<cstring>
#include<cmath>
#include<algorithm>
using namespace std;
double A,B,C,D;
double F(double x)
{
    return A * x * x * x + B * x * x + C * x + D;
}
int main()
{
    scanf("%lf%lf%lf%lf",&A,&B,&C,&D);
    int s = 0;
    for(int i = -100;i <= 100;i++){
        double l = i,r = i + 1.0;
        double x1 = F(l),x2 = F(r);
        if(!x1){ //左边界判断,注意我们对i的取值是1-100所以只需要判断左边界即可
            s++;
            printf("%.2f ",l);
        }
        if(x1 * x2 < 0){ //有根
            while(r - l >= 0.001){
                double mid = (l + r) / 2.0;
                if(F(mid) * F(l) < 0) r = mid;
                else if(F(mid) * F(r)) l = mid;
            }
            printf("%.2f ",r);
            s++;
        }
        if(s == 3) break; //找到三个根就直接跳出
    }
    return 0;
}
相关标签: 洛谷题解 算法