[二分] 洛谷P1024一元三次方程求解

题目链接

给一个一元三次方程

a x 3 + b x 2 + c x + d = 0
求这个方程的解,保证该方程存在三个不同实根(根的范围在 -100到100之间),且根与根之差的绝对值 ≥1 。

思路:因为根与根之差的绝对值大于等于1,保证了在长度为1的区间上最多只有1个解;所以可以在-100到100之间遍历答案,找到一段区间上有解之后,可以二分来寻找答案的具体位置;
二分的方法如下:

inline double g(double left,double right){
    double mid;
    while(right-left>=0.001){
        mid=(left+right)/2;
        if(f(left)*f(mid)>0) left=mid;
        else right=mid;
    }
    return right;
}

最后总代码如下:

#include <cstdio>
using namespace std;

double a,b,c,d;

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

inline double g(double left,double right){
    double mid;
    while(right-left>=0.001){
        mid=(left+right)/2;
        if(f(left)*f(mid)>0) left=mid;
        else right=mid;
    }
    return right;
}

int main() {
    scanf("%lf%lf%lf%lf",&a,&b,&c,&d);
    int ans=0;
    for(int i=-100;i<100 && ans<3;i++){
        if(f(i)==0) ans++,printf("%.2f ",(double)i);
        else if(f(i)*f(i+1)<0) ans++,printf("%.2f ",g(i,i+1));
    }
    return 0;
}

错点:
1.输出的时候要把i强制转为double输出;
2.遍历判断的时候要注意先判断是否为0的情况,再判断非0情况;

猜你喜欢

转载自blog.csdn.net/qq_33982232/article/details/81844517