洛谷-1024一元三次方程式の解


テーマ記述には,ax 3+bx 2+cx 1+dx 0=0のような一元三次方程式がある.この方程式の各係数(a,b,c,dは実数)を与え,この方程式には3つの異なる実根(根の範囲は−100〜100の間)が存在し,根と根の差の絶対値≧1であることを約束した.この3つの実ルート(ルートとルートの間にスペースが残っている)を小さいから大きいまで順次同じ行に出力し、小数点以下2桁まで正確にする必要があります.ヒント:方程式f(x)=0を記し、2個の数x 1とx 2が存在し、x 1入出力フォーマット入力フォーマット:1行、4個の実数A、B、C、D.出力フォーマット:1行、3つの実根で、小数点以下222ビットまで正確です.
入出力サンプル入力サンプル#1:1-5-420
出力サンプル#1:-2.00 2.00 5.00
直线搜索每次从-100开始每次步长0.5,直到100,如果符号不同就开始二分得解答,注意精度
#include
#include
#include
using namespace std;
double A,B,C,D;
double f(double x){
    return A*x*x*x+B*x*x+C*x+D;
}
double ok(double l,double r){
    double mid=0;
    while(fabs(r-l)>=1e-7){
        mid=(l+r)/2;
        if(f(mid)*f(l)<=0){
            r=mid;
        }else{
            l=mid;
        }
    }
    return mid;
}
int main(){
    cin>>A>>B>>C>>D;
    for(double i=-100.0;i<=100.0;i+=0.5){
        if(f(i)*f(i+0.5)<=0&&fabs(f(i+0.5)!=0)) printf("%.2lf ",ok(i,i+0.5));
    }
    return 0;
}