解题思路:
先遍历小数为零的根可根据要求输出,对于小数部分不为零的,再在大致范围内(根据精度)使用二分法求具体的根。
AC代码:
#include <iostream>
#include <cstdio>
using namespace std;
double f(double x);
double a,b,c,d;
int main()
{
int count_=0;
cin>>a>>b>>c>>d;
for(double i=-100;i<=100;i++)
{
double r=i+1;
if(f(i)==0)
{printf("%.2f ",i);
count_++;}
double l=i;
if(f(l)*f(r)<0) //零点定理
{
while(r-l>0.001) //保证精度符合要求,题中要保留2位小数,我们计算到4位避免四舍五入时误差过大
{
double mid=(r+l)/2; //二分法
if(f(l)*f(mid)<=0)
r=mid;
else
l=mid;
}
printf("%.2f ",(l+r)/2);
count_++;
}
if(count_==3) //当有三个解时,可提前结束
break;
}
return 0;
}
double f(double x)
{
return a*x*x*x+b*x*x+c*x+d;
}