P1024 [NOIP2001 提高組] 一元三次方程求解
//重要;求解方程的根
//https://www.luogu.com.cn/problem/P1024?contestId=96614
#include<bits/stdc++.h>
using namespace std;
double a,b,c,d;
double f(double x)
{
return a*x*x*x+b*x*x+c*x+d;
}
int main()
{
cin>>a>>b>>c>>d;
//根的范圍在-100到100之間,劃分成三個區(qū)間二分?
//枚舉-100到100內(nèi)的每一個點x,(x-0.0005,x+0.0005)兩個區(qū)間端點的值看是否異號是則說明x是艮
//或者是f(x)==0 則也是一個根
//暴力過一半
// for(int i=-100;i<=100;i++)
// {
// double x = i-0.000005;
// double y = i+0.000005;
// if(f(x)*f(y)<0||f(i)==0)
// {
// printf("%.2f ",(double)i);
// }
//
//二分
for(double i=-100;i<=100;i++)
{
//在每一個間隔一的區(qū)間里二分
double l=i;
double r=i+1;
if(f(l)==0)
{
printf("%.2f ",l);
continue;
}
if(f(l)*f(r)<0)
{
while(r-l>=1e-3)//設(shè)置精度信息0.0001是1e-3
{
double mid=(l+r)/2;
if(f(mid)*f(r)<=0)
{
//根在mid和r之間
l=mid;
}
else
{
//根在l和mid之間
r=mid;
}
}
printf("%.2f ",r);
}
}
return 0;
}