[2001年NOIP提高组] 一元三次方程求解
[2001年NOIP提高组] 一元三次方程求解
思路:先在范围内枚举每一种可能,如果直接枚举到根就输出;否则确定区间,找根。
在找根时,运用了二分,分别从左右找。
代码如下:
#include<iostream>
#include<cstring>
#include<cstdio>
using namespace std;
double a,b,c,d;//方程中的各项系数
double f(double x)//将x带入函数
{
return (a*x*x*x+b*x*x+c*x+d);
}
int main()
{
double x,x1,x2,xx;
scanf("%lf%lf%lf%lf",&a,&b,&c,&d);
for(x=-100;x<=100;x++)//枚举每一种可能
{
x1=x;x2=x+1;//确定根的可能区间
if(f(x1)==0) printf("%.2f ",x1);//若x1为根,输出
else if(f(x1)*f(x2)<0)//若根在区间[x1,x2]中
{
while(x2-x1>=0.001)//若区间[x1,x2]不满足精度要求,则循环
{
xx=(x1+x2)/2;//计算区间[x1,x2]的中间位置
if((f(x1)*f(xx))<=0)//若根在左子区间,则调整左指针
x2=xx;
else x1=xx;//区间[x1,x2]满足精度要求,确定x1为根
}
printf("%.2f ",x1);
}
}
cout<<endl;
return 0;
}