如何求一个数字的算术平方根(又叫开根号,或者开方)? 大家普遍都是用计算器直接计算的,对于程序员来说,就是调用sqrt()方法。但是其内部又是怎么实现的呢?
方法一:迭代法
学过计算方法的应该都还有印象:一个函数 f(x) 在区间 [a,b] 上连续,且 f(x)=0 在 x∈[a,b] 上有解,求x?
最简单的就是用二分法:分别求f(a)、f(b)、f[(a+b)/2],哪两个乘积为负数则把那两个区间当做 [a,b] ,然后一直循环,直到 a-b 达到要求的精度为止。
再有一种就是用迭代法:迭代法有很多种,公共的思想是选一个数值,然后不断循环迭代,让它逐渐逼近真实解。至于怎么迭代可以让它趋近真实解,不同问题的求解用的迭代方法不同,我们暂且先忽略。
其实二分法也算是迭代法的一种了。
double _sqrt(double a)
{double x1 = a;double x2 = a/2;while(fabs(x1-x2) > 0.00000001) //fabs函数是一个求绝对值的函数,求出x的绝对值{x1 = x2;x2 = (x1+a/x1)/2; ///////迭代的核心代码}return x1;
}
x1减少,a/x1增加 , x1减少的幅度大于x2的检少幅度。
时间复杂度 < lgN
参考:https://blog.csdn.net/bone_ace/article/details/45870975