描述

形如: ax^3+bx^2+cx+d=0 这样的三次方程,给出该方程中各项的系数(a,b,c,d均为实数),请求出该方程在指定范围内的一个根。

例如方程:2x^3+3x^2+4x+5=0,在[-10,10]范围内有一个根为-1.371134。

测试集给定的范围保证刚好有一个根。

比如输入:

1.2 -1.0 3.4 4.4

-3 0

则根为:-0.856541

又比如输入:

-1.2 2.3 4.4 -3

-3 0

则根为:-1.534508


格式

输入格式

两行实数,第一行为4个实数,分别代表a,b,c,d。第二行两个实数,表示左右区间。

输出格式

一个实数,表示方程的解,精确到小数点后6位。


样例

输入样例

2.3 4.2 -1.7 -3
-10 10

输出样例

0.849809


限制

时间限制:100 ms
内存限制:16384 KB


提示

注意题目对精度和速度的要求


代码

  1. #include<stdio.h>
  2. #include<math.h>
  3. int main()
  4. {
  5. double a,b,c,d;
  6. double x1,x2,x0,fx1,fx2,fx0,x,y;
  7. scanf("%lf %lf %lf %lf",&a,&b,&c,&d);
  8. scanf("%lf %lf",&x1, &x2);
  9. fx1=(( a * x1 + b) * x1 + c) * x1 + d;
  10. fx2=(( a * x2 + b) * x2 + c) * x2 + d;
  11. do
  12. {
  13. x0 = ( x1 + x2 ) / 2;
  14. fx0 = (( a * x0 + b) * x0 + c) * x0 + d;
  15. if( (fx0 * fx1) < 0 )
  16. {
  17. x2 = x0;
  18. fx2 = fx0;
  19. }
  20. else
  21. {
  22. x1 = x0;
  23. fx1 = fx0;
  24. }
  25. }
  26. while( fabs( fx0 ) >= 1e-7 ); //求根精度
  27. printf( "%lf", x0 );
  28. return 0;
  29. }