方法一: 使用标准库函数, <math.h>中的sqrt函数直接计算。
其函数原型为: float sqrt (float),double sqrt (double),double long sqrt(double long)
但是不知道标准库函数时怎么实现的。
方法二:二分查找法
可以根据自己希望的精确度来规定循环的结束条件。
- double sqrtby2(double a)
- {
- if(a <= 0)
- return 0;
- double mid, pre;
- double low=0, high=a;
- mid = (low + high)/2;
- do{
- if(mid*mid > a)
- high = mid;
- else
- low = mid;
- pre = mid;
- mid = (low + high)/2;
- }while(abs(mid-pre) > 0.0000001);
- return mid;
- }
要计算a的平方根,首先随便猜一个估计值c,然后不断令c等于c和a/c的平均数。
- double sqrtbynewton(double a)
- {
- double c = a;//这里用a本身作为估计值
- double pre;
- do
- {
- pre = c;
- c = (x + a/c)/2;
- }while(abs(c-pre) > 0.0000001);
- return x;
- }
牛顿迭代法的依据:
设曲线f(x) = x^2 - a,那么该曲线与x轴的交点的x的值即为所求的a的平方根。现在,借助曲线的切线来逐步接近那个交点。该曲线在某个值x'处的切线为y=2x'(x-x')+x'^2-a。那么在曲线在估计值c时的切线为y=2c(x-c)+c^2-a,该切线与x轴的交点为(c+a/c)/2,作图即可看出,这个点距离所求点更接近了。
附加:Leetcode上也有此题,只不过要求返回值是int。如果在迭代时就用int,可能会死循环而求不出结果。所以还是先用浮点数求,然后再取整。
class Solution {
public:
int sqrt(int x) {
if(x <= 0)
return 0;
double c = x;
double old;
do
{
old = c;
c = (c + x/c)/2;
}while(abs(old - c) > 0.0000001);
return int(c);
}
};