6-28 牛顿迭代求平方根 (10分)

6-28 牛顿迭代求平方根 (10分)
 

用牛顿迭代法求非负整数的平方根。 使用1作为猜测的初始值,不要对0做特别判断。

函数接口定义:

double ntsqrt(int x, double eps);
 

x:要求平方根的非负整数; eps:当求得的平方根的平方与x的差小于eps值停止迭代。

裁判测试程序样例:

#include <stdio.h>

double ntsqrt(int x, double eps);

int main()
{
  int x;
  double eps;

  scanf("%d %lf", &x, &eps);

  printf("%.4f", ntsqrt(x, eps));

  return 0;
}

/* 请在这里填写答案 */
 

输入样例:

在这里给出一组输入。例如:

319 0.01
 

输出样例:

在这里给出相应的输出。例如:

17.8606



代码讲解:这道题很经典,首先求平方根求法我能想到的有俩种办法,第一种是二分法,利用二分法求出平方根,第二种方法就是这个迭代平方根法。

这种办法是这样的 设f(x)=x2-n n是一个常数就是我们要求的那个数的平方。对于f(x)来说只要我们求出让f(x)=0 x的值就结束了。当然我们可以一点一点试但是这样的复杂度是非常高的。
我们利用这个函数在某个(x,f(x))切线和x轴的交点 作为新的x值继续迭代,直到俩个x已经非常接近了 那么x值就已经找到了


double ntsqrt(int x, double eps)
{
 
 double s=1;
 double x2=(s+x/s)/2.0;
 
 double diff=x2*x2-x;
 if(diff<0)
 diff=-diff;
 while(diff>eps)
 {
  s=x2;
  x2=(s+x/s)/2;
  diff=x2*x2-x;
  
  if(diff<0)
     diff=-diff;
  
 }
 
 return x2;
 
}

posted @ 2020-10-19 20:50  罪梦者  阅读(384)  评论(0)    收藏  举报