首页 > 其他分享 >[NOIP2001 提高组] 一元三次方程求解

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

时间:2022-08-14 19:13:28浏览次数:73  
标签:一元 NOIP2001 求解 double x2 x1 0.001

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

标签:一元,NOIP2001,求解,double,x2,x1,0.001
From: https://www.cnblogs.com/xdzxjinghan/p/16585660.html

相关文章