注意:
1.二分边界
2.字符的处理,因为最后是输出两位小数的数字,那么定义的时候就要用double或则float,double的话输入要用%lf,float或则double的输出都是用%.2f
3.注意有个小坑,就是一开始的时候很有可能刚好是那个值需要判断一下
但是中间那个内部循环我真的不明白,为什么又不需要这样判断呢。
4.擅长用调用函数的方法,使代码简化,且保持方便
代码
只通过50%
#include<stdio.h>
double a,b,c,d;
double result(double x);
int main()
{
double mid,left,right,i,j,y1,y2,y3,y4;
scanf("%lf%lf%lf%lf",&a,&b,&c,&d);
for(i=-100;i<=100;i++) //根与根之间是>=1,分为200个小区间
{
left=i;right=i+1;
y1=result(left);
y2=result(right);
if(y1==0)
{
printf("%.2f ",i); //这是一个小坑,要注意
}
else if(y1*y2<0)
{
for(j=0;j<100;j++) //因为是精确到0.01,所以只需要把分100次就ok了
{
mid=(left+right)/2;
y3=result(mid);
y4=result(right); //y4不可能为零,因为已经验证过了,如果y4其实就是y2,但这个循环前提是y1*y2<0
if(y3==0)
{printf("%.2f ",i);
break;}
else
{if(y3*y4<0)
{
left=mid;
}
else
{
right=mid;
}
}
}
printf("%.2f ",right); //因为这里是近视值,那是选用哪一个,是right还是left呢?
}
}
}
double result(double x)
{
return a*x*x*x+b*x*x+c*x+d;
}
通过100%
#include<stdio.h>
double a,b,c,d;
double result(double x);
int main()
{
double mid,left,right,i,j,y1,y2,y3,y4;
scanf("%lf%lf%lf%lf",&a,&b,&c,&d);
for(i=-100;i<=100;i++) //根与根之间是>=1,分为200个小区间
{
left=i;right=i+1;
y1=result(left);
y2=result(right);
if(y1==0)
{
printf("%.2f ",i); //这是一个小坑,要注意
}
else if(y1*y2<0)
{
for(j=0;j<100;j++) //因为是精确到0.01,所以只需要把分100次就ok了
{
mid=(left+right)/2;
y3=result(mid);
y4=result(right);
// if(y3==0)
// printf("%.2f ",i);
if(y3*y4<=0)
{
left=mid;
}
else
{
right=mid;
}
}
printf("%.2f ",right);
}
}
}
double result(double x)
{
return a*x*x*x+b*x*x+c*x+d;
}