P1024 [NOIP2001 提高组] 一元三次方程求解
纯代码记录
#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;elser=mid;}int ans;//手动四舍五入,注意正负号!!if(mid>0)ans = (mid+0.005)*100;elseans = (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]);
}