[NOIP2001 提高组] 一元三次方程求解

[NOIP2001 提高组] 一元三次方程求解

  • 分析:由题意得,本题要求的是一元三次方程等于0时的三个根,由图像我们可知等于0时的根左右两侧的点的纵坐标乘积(也就是根)为负数,因为题目说要精确到小数点后两位,所以在for循环中i+=0.001,再定义一个j为所求点另一侧的点的横坐标,用x1,x2表示为两根(也就是两点的纵坐标),如果这两点纵坐标相乘为负,可以证明所求的根就在这两点之中,在此可以采取折中的方式进一步精确点的位置,最后输出。
  • #include<iostream>
    #include<cstdio>
    #include<cstring>
    using namespace std;
    int main()
    {
    double a,b,c,d,s;
    cin>>a>>b>>c>>d;
    for(double i=-100;i<=100;i+=0.001)//精确到两位
    {
    double j=i+0.001;//相当于一个两个点中间相隔0.001
    double x1=a*i*i*i+b*i*i+c*i+d;
    double x2=a*j*j*j+b*j*j+c*j+d;
    if(x1*x2<0)//说明这两个点在x轴异侧,中间包含根
    {
    s=(i+j)/2;//因为之前已经直接精确到了0.001,所以可以直接·取中间值输出
    printf("%.2lf ",s);
    }
    }
    return 0;
    }

posted @ 2022-08-14 19:07  4lovls  阅读(203)  评论(0)    收藏  举报