试题描述:
输入
一行,4个实数 a,b,c,d
输出
一行,3 个实根,从小到大输出,并精确到小数点后 2 位。
样例输入
1 -5 -4 20
样例输出
-2.00 2.00 5.00
错误代码如下(会没有输出)
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 }
标签:一元,%.,NOIP2001,输出,double,0.01,求解 From: https://www.cnblogs.com/xdzxxintong/p/16610755.html