[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;

 }

posted @ 2022-08-22 10:30  shanyingrui  阅读(75)  评论(0编辑  收藏  举报