题意
解析
我们观察到,整个式子的单调性并不明确,但是每个根之间的距离<1,所以对于长度为1的区间,如果这个区间存在根,在根的右边和左边的值一定某一个大于0,另一个小于0,因此符合区间的单调。
值得注意的是,如果区间长度设置为1,那么可能会重复计算,因此区间长度设置为0.99。
当我们对某个存在根的区间进行二分查找时,首先要确定其单调性。
代码
#include<bits/stdc++.h>
using namespace std;
const int N=1e6+5;
typedef long long ll;
const double esp=1e-3;
int r[N];
double a,b,c,d;// ax^3+bx^2+cx+d=0
double get(double x){
return a*x*x*x+b*x*x+c*x+d;
}
double erfen(double l,double r){
//判断一下是递减还是递增
int add=(get(r)-get(l))>0;
while(r-l>=esp){
double mid=(r+l)/2;
if(get(mid)<0){
if(add)
l=mid;
else
r=mid;
}
else{
if(add)
r=mid;
else
l=mid;
}
}
return l;
}
int main(){
cin>>a>>b>>c>>d;
int cnt=0;
double l=-100,r=-99.01;
while(r<=100){
if(get(l) * get(r)<=esp){
printf("%.2lf ",erfen(l,r));
cnt++;
}
l++,r++;
}
}