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]);
}