纯代码记录
#include <iostream>
#include <math.h>
using namespace std;
double a,b,c,d;
double res[3];//用于存放三个解
int resCount;
inline double F(double x)//三次函数
{
return a*pow(x,3)+b*pow(x,2)+c*x+d;
}
//模糊的二分查找
void getRes(double lF,double l,double r)//lF是初始l位置的函数值,用于二分判断
{
double mid;
double f;
while(r-l>=0.001)
//误差不影响答案四舍五入精度时,对于这个精度我不是很有把握说他是一定正确的
//举例:0.46699999…… 和 0.4670000……的mid之类的,这里我有点疑惑,但是这个精度就已经AC了
{
mid = l +(r-l)/2;
f = F(mid);
if(f==0)
break;
else if(f*lF>0)
l=mid;
else
r=mid;
}
int ans;
//手动四舍五入,注意正负号!!
if(mid>0)
ans = (mid+0.005)*100;
else
ans = (mid-0.005)*100;
res[resCount++]=ans*1.0/100;
}
int main()
{
cin >> a >> b >> c >> d;
double i=-100;
resCount =0;
double f;
double preF;
while(i<=100)//遍历每一个整数
{
f = F(i);
if(f==0)
res[resCount++]=i;
else if(i>-100 && f*preF<0)//说明在i和i-1之间,在这之间进行一次查找
{
getRes(preF,i-1,i);
}
preF=f;
i++;
}
printf("%.2f %.2f %.2f",res[0],res[1],res[2]);
}