[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;
 }
 
                    
                
 
                
            
         浙公网安备 33010602011771号
浙公网安备 33010602011771号