一元三次方程求解
思路:
因为这道题放在二分题单里 暴力的话就用二分吧(貌似还有巨佬用公式做,待会康康)。但是想来想去不知道怎么二分233(可能这就是菜吧)。直到说看到根与根之差的绝对值>=1,噢原来是一个一个区间来搜索啊…。
其实关键的地方大概就在于控制精度和区间的边界了。
代码试图特判左边界,直接continue,二分区间内部,当然这样的话你会发现100被漏掉了,那就特判个100。
精度关键在于二分,因为left和right最终距离会小于0.01,那么就不用考虑是upper_bound还是lower_bound。直接ans每次都切换成为left或right。
代码:
#include<bits/stdc++.h>
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(){
int cnt=0;
double ans;
double l,r,m,tmp1,tmp2;
scanf("%lf%lf%lf%lf",&a,&b,&c,&d);
for(int i=-100;i<100;i++){
l=i,r=i+1;
tmp1=f(l),tmp2=f(r);
if(!tmp1){
printf("%.2lf ",l);
cnt++;
continue;
}
if(tmp1*tmp2<0){
while(r>=l){
m=(l+r)/2;
if(f(m)*f(l)<=0)r=m-0.0001,ans=m;
else l=m+0.0001,ans=m;
}
printf("%.2lf ",ans);
cnt++;
}
if(cnt==3)break;
}
l=100;
if(cnt==2)printf("%.2lf ",l);
return 0;
}