Openjudge NOI题库 ch0111/t6253 用二分法求方程的根

这题只是考你最后有没有(r-l)/2而已……

总时间限制:
1000ms
内存限制:
65536kB
描述

用二分法求下面方程在(-10, 10)之间的一个根。
2x3- 4x2+ 3x- 6 = 0

输入
一个小于1的非负实数e,它的值表示所能允许的误差
输出
一个实数,其值为求得的一个根,要求精确到小数点后8位。
若该区间上没有根,则输出“No Solution”
样例输入
0
样例输出
2.00000000
提示
对于一个连续函数f(x),若f(a)*f(b) <= 0,则f(x)在区间[a, b]内至少有一个根。
特别的,对于一个单调的连续函数,上述定理得逆定理也成立
若[a, b]上有根,则可进一步考察根是否在 [a, (a+b)/2]内,或者在[(a+b)/2, b]内。

若b-a <= e 则可终止迭代,并认为(a+b)/2是一个近似解,将它输出

请使用double类型!
 1 #include <stdio.h>
 2 #include <math.h>
 3 double f(double x)
 4 {
 5     x=2*pow(x,3)-4*pow(x,2)+3*x-6;
 6     return x;
 7 }
 8 int main()
 9 {
10     double e;
11     double mid,l=-10,r=10,fl,fr,fm;
12     scanf("%lf",&e);
13     fl=f(l);
14     fr=f(r);
15     while(!(r-l<=e))
16     {
17         mid=(l+r)/2;
18         fm=f(mid);
19         if(fm*fl<0)
20         {
21             r=mid;
22             fr=fm;
23         }
24         else
25         {
26             l=mid;
27             fl=fm;
28         }
29         if(r-l<0.000000001) break;
30     }
31     mid=(r+l)/2;
32 //    if(e>=1) printf("No Solution"); 经测试这项不需要写
33     printf("%.8lf",mid);
34     return 0;
35 }
原文地址:https://www.cnblogs.com/KakagouLT/p/4995314.html