题目来源-洛谷P1024
#include<stdio.h>
#include<math.h>
double a,b,c,d;//这里abcd在定义函数时也用到了所以放在了全局
int main()
{
double erfen(double,double);//声明一个二分查找的函数
int z=0,left,right,mid;
float x[3];//3个根
scanf("%lf%lf%lf%lf",&a,&b,&c,&d);
for(int i=-100;i<=100;i++)
{
if(apow(i,3)+bpow(i,2)+ci+d==0)//先粗略地遍历查找整数根
{
x[z]=i;
z++;
}
if((apow(i,3)+bpow(i,2)+ci+d)(apow(i+1,3)+bpow(i+1,2)+c(i+1)+d)<0)//零点存在定理找出根的范围
{
left=i;
right=i+1;
x[z]=erfen(left,right);//二分查找找出根的近似值
z++;
}
}
printf("%.2lf %.2lf %.2lf",x[0],x[1],x[2]);
return 0;
}
double erfen(double x,double y)//二分查找递归
{
if(y-x<0.01)return (x+y)/2;//精确度达到要求就停止调用自身
if((apow((x+y)/2,3)+bpow((x+y)/2,2)+c*(x+y)/2+d)(apow(x,3)+bpow(x,2)+cx+d)<0)
{
return erfen(x,(x+y)/2);
}
else return erfen((x+y)/2,y);
}