题目描述
输入样例:
3 -1 -3 1
-0.5 0.5
输出样例:
0.33
我的解答
非常原始,提交之后有一个点没有通过,显示的原因也很匪夷所思:“中点的f值很小但不一定是根”,可是题目明明说了会保证一定有根,所以我就去查了答案。
#include<stdio.h>
int main()
{
double a,b,c,d;
scanf("%lf %lf %lf %lf",&a,&b,&c,&d);
double m1,m2;
scanf("%lf %lf",&m1,&m2);
if((a*m1*m1*m1+b*m1*m1+c*m1+d)==0)
printf("%.2f",m1);
else if((a*m2*m2*m2+b*m2*m2+c*m2+d)==0)
printf("%.2f",m2);
else if((a*m1*m1*m1+b*m1*m1+c*m1+d)*(a*m2*m2*m2+b*m2*m2+c*m2+d)>0)
printf("%.2f",(m1+m2)/2);
else
{
while((a*m1*m1*m1+b*m1*m1+c*m1+d)*(a*m2*m2*m2+b*m2*m2+c*m2+d)<0)
{
double m3=(m1+m2)/2;
if((a*m3*m3*m3+b*m3*m3+c*m3+d)==0)
{
printf("%.2f",m3);
break;
}
else if((a*m3*m3*m3+b*m3*m3+c*m3+d)*(a*m1*m1*m1+b*m1*m1+c*m1+d)>0)
m1=m3;
else if((a*m3*m3*m3+b*m3*m3+c*m3+d)*(a*m2*m2*m2+b*m2*m2+c*m2+d)>0)
m2=m3;
}
}
}
参考答案
原地址: 参考答案地址
#include <stdio.h>
#include <math.h>
double a3, a2, a1, a0;
double f(double x)
{
return a3*pow(x,3)+a2*pow(x,2)+a1*x+a0;
}
int main()
{
int flag=1;
double a,b;
scanf("%lf%lf%lf%lf",&a3,&a2,&a1,&a0);
scanf("%lf%lf",&a,&b);
while((b-a)>0.001)
{
if(f((a+b)/2)==0)
{
printf("%.2f\n",(a+b)/2);
flag=0;
break;
}
else if(f((a+b)/2)*f(a)>0)
{
a=(a+b)/2;
}
else
{
b=(a+b)/2;
}
}
if(flag)
printf("%.2f\n",(a+b)/2);
return 0;
}
我的修改
#include<stdio.h>
int main()
{
double a,b,c,d;
scanf("%lf %lf %lf %lf",&a,&b,&c,&d);
double m1,m2;
scanf("%lf %lf",&m1,&m2);
int flag=0;
while((m2-m1)>0.001 && flag==0)
{//这个判断是重点
if((a*m1*m1*m1+b*m1*m1+c*m1+d)==0)
{
printf("%.2f",m1);
flag=1;
break;
}
else if((a*m2*m2*m2+b*m2*m2+c*m2+d)==0)
{
printf("%.2f",m2);
flag=1;
break;
}
else if((a*m1*m1*m1+b*m1*m1+c*m1+d)*(a*m2*m2*m2+b*m2*m2+c*m2+d)>0)
{
printf("%.2f",(m1+m2)/2);
flag=1;
break;
}
else
{
while((m2-m1)>0.001 && (a*m1*m1*m1+b*m1*m1+c*m1+d)*(a*m2*m2*m2+b*m2*m2+c*m2+d)<0)
{//这个判断是重点
double m3=(m1+m2)/2;
if((a*m3*m3*m3+b*m3*m3+c*m3+d)==0)
{
printf("%.2f",m3);
flag=1;
break;
}
else if((a*m3*m3*m3+b*m3*m3+c*m3+d)*(a*m1*m1*m1+b*m1*m1+c*m1+d)>0)
m1=m3;
else if((a*m3*m3*m3+b*m3*m3+c*m3+d)*(a*m2*m2*m2+b*m2*m2+c*m2+d)>0)
m2=m3;
}
}
}
if(flag==0)
printf("%.2f",(m1+m2)/2);
}
我的收获
- 读入double类型的数据要用%lf,如果用%f全部读入0。
- 看完参考答案,我只能说自己的思维还是太简单了,纯纯暴力求解。
- 当时在写a * m1 * m1 * m1 + b * m1 * m1 + c * m1 + d的时候自己也发现了这样写有点繁琐,可是又觉得只是三次方而已啊,所以就没写函数,现在看来确实提取函数可以提高代码的可读性。