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