【题目描述】
有形如:ax3+bx2+cx+d=0 这样的一个一元三次方程。
给出该方程中各项的系数(a,b,c,d 均为实数),并约定该方程存在三个不同实根(根的范围在-100至100之间),且根与根之差的绝对值>=1。要求由小到大依次在同一行输出这三个实根(根与根之间留有空格),并精确到小数点后2位。
【输入格式】
一行,包含四个实数a,b,c,d,相邻两个数之间用单个空格隔开。
【输出格式】
一行,包含三个实数,为该方程的三个实根,按从小到大顺序排列,相邻两个数之间用单个空格隔开,精确到小数点后2位。
【分析】
简单的分治算法,每一次找出相邻的两个数,在每次缩小范围就可以了。
【代码】
1 #include<bits/stdc++.h> 2 3 using namespace std; 4 5 double a,b,c,d,x,xx,x1,x2; 6 7 double calc(double n){ 8 return a*n*n*n+b*n*n+c*n+d; 9 } 10 11 int main() 12 { 13 scanf("%lf%lf%lf%lf",&a,&b,&c,&d); 14 for(int x=-100;x<=100;x++){ 15 x1=x; 16 x2=x+1; 17 if(calc(x)==0)printf("%.2lf ",x1); 18 else if(calc(x1)*calc(x2)<0){ 19 while(x2-x1>=0.001){ 20 xx=(x1+x2)/2; 21 if(calc(x1)*calc(xx)<=0)x2=xx; 22 else x1=xx; 23 } 24 printf("%.2lf ",x1); 25 } 26 } 27 return 0; 28 }