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

试题描述:
enter image description here

输入

一行,4个实数 a,b,c,d

输出

一行,3 个实根,从小到大输出,并精确到小数点后 2 位。

样例输入
1 -5 -4 20
样例输出
-2.00 2.00 5.00


分析:
简单的枚举每个x看是否符合题意即可


错误代码如下(会没有输出)
 1 #include<iostream>
 2 using namespace std;
 3 int main()
 4 {
 5     double a,b,c,d;
 6     cin>>a>>b>>c>>d;
 7     double j;
 8     for(double i=-100;i<=100;i+=0.01)
 9     {
10         j=i+0.01;
11         if(a*i*i*i+b*i*i+c*i+d==0)
12             printf("%.2lf ",i);
13     }
14     return 0;
15 }
16 //精度缺失 

注意,第11 行写成 if(a*i*i*i+b*i*i+c*i+d==0 是错误的

因为我们设置的是double类型,而计算机在处理不同类型的数时会造成精度缺失

又因为题目告诉我们精确到0.01

所以我们得到以下两种解法

1 if(a*i*i*i+b*i*i+c*i+d<0.01&&a*i*i*i+b*i*i+c*i+d>-0.01)
2     printf("%.2lf ",i);

或根据一元三次函数增长的连续性,即<0和>0中间插着==0

 1     double j;
 2     for(double i=-100;i<=100;i+=0.01)
 3     {
 4         j=i+0.01;
 5         if(a*i*i*i+b*i*i+c*i+d<0.01&&a*i*i*i+b*i*i+c*i+d>-0.01)
 6             printf("%.2lf ",i);
 7         else
 8          if((a*i*i*i+b*i*i+c*i+d<0&&a*j*j*j+b*j*j+c*j+d>0)
 9          ||(a*i*i*i+b*i*i+c*i+d>0&&a*j*j*j+b*j*j+c*j+d<0))
10         printf("%.2lf ",i+=0.01);
11     }

 

posted @ 2022-08-21 20:15  要不要吃哈密瓜  阅读(24)  评论(0编辑  收藏  举报