刷清橙OJ--A1081.二分求方程根

来源:互联网 发布:二级备案域名免费注册 编辑:程序博客网 时间:2024/06/12 23:22
问题:
A1081. 二分求方程根
时间限制:1.0s   内存限制:512.0MB  
总提交次数:3275   AC次数:935   平均分:29.08
问题描述
  给定一个连续实函数f(x)和一个区间[a, b],已知f(a)*f(b)<0。由微积分的知识可知,在[a, b]上至少存在一个点c,使得f(c)=0,即f(x)在[a, b]区间上至少有一个根。请求出这个根。
  这是一个补充程序的试题,你要完成一个函数
  double getRoot(double (*f)(double), double a, double b)
  并将f(x)=0的在[a, b]区间上的一个根返回,考虑到实数的误差,你只要使得f(x)的绝对值小于10-6(1e-6)即可。
  其中,第一个参数是一个函数指针,所表示的函数将在测试的时候给出,你可以把它看成是如下的函数:
  double f(double x)
  并可以直接调用f(x)来得到这个函数在参数为x时的值。
算法描述
  由于f(x)在[a, b]上连续且f(a)*f(b)<0,所以可以任取[a, b]区间上的一个点p,若f(p)为0(或者绝对值小于10-6),则p为方程的根,否则f(p)一定与f(a)同号(同正负)或与f(b)同号,如果f(p)与f(a)同号,则在[p, b]上存在一个根,否则在[a, p]上存在一个根。
  通过上面的一步,可以将根的范围从[a, b]缩小为[a, p]或[p, b],重复这种方法可以不断缩小根的范围,直到找到根。
  一般情况下,我们取p=(a+b)/2,即每次使用区间的中点进行判断,这种求根的方法叫做二分法。


这是一道完善程序的试题,你只需要在下面程序标注的"@你的代码"的位置补充适当的语句或语句段使程序能正确运行即可,在提交的时候,你要提交的内容只包括补充的内容,不包括其他的代码。
  1. #include <cstdlib>
  2. #include <cstdio>
  3. #include <cmath>
  4. using namespace std;
  5. double getRoot(double (*f)(double), double a, double b)
  6. {
  7. @你的代码
  8. }
代码:
double x = (a + b) / 2;while(fabs(f(x)) >= 1e-6){if(f(x) * f(a) > 0){a = x;}else{b = x;}x = (a + b) / 2;}return x;



原创粉丝点击