zoukankan      html  css  js  c++  java
  • 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 }
  • 相关阅读:
    0.Mysql优化框架
    [C]extern char **environ
    [C]Armstrong Number
    [C]struct, union的结合
    [C]enum类型
    [C]fibonacci series, recursion, time.h
    [C/JAVA]二维数组
    [C] char**, swich-case, refactoring, stdbool.h
    hardly/scarcely ... goes by without ...
    [C]随机数生成
  • 原文地址:https://www.cnblogs.com/KakagouLT/p/4995314.html
Copyright © 2011-2022 走看看