给一个一元三次方程
思路:因为根与根之差的绝对值大于等于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情况;