这题只是考你最后有没有(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 }