69. x 的平方根

题目描述: 实现 int sqrt(int x)函数。
计算并返回x的平方根,其中x是非负整数。 由于返回类型是整数,结果只保留整数的部分,小数部分将被舍去。
示例 1:
输入: 4
输出: 2
示例 2:
输入: 8
输出: 2
说明: 8 的平方根是 2.82842..., 由于返回类型是整数,小数部分将被舍去。

  • 常规解法:需要注意细节
//C

int mySqrt(int x){
    if(x == 1) return 1;
    //注意res和i的类型,在计算过程中,res的值可能超出int范围而需要注意类型转换,使用i也应该是long long类型
    long long i;
    long long res;
    for(i = 1; i <= x / 2 + 1; i++){
        res = i * i;
        if(res > x) break;
    }
    return i - 1;
}

//JS

var mySqrt = function(x) {
    if(x == 1) return 1;
    
    for(let i = 1; i <= Math.floor(x / 2) + 1; i++){
        if(i * i > x) return i - 1;
    }
};
  • 二分查找:
//C

int mySqrt(int x) {
        //注:在中间过程计算平方的时候可能出现溢出,所以用long long。
        long long i=0;
        long long j=x/2+1;//对于一个非负数n,它的平方根不会大于(n/2+1)
        while(i<=j)
        {
            long long mid=(i+j)/2;
            long long res=mid*mid;
            if(res==x) return mid;
            else if(res<x) i=mid+1;
            else j=mid-1;
        }
        return j;
    }

//JS

var mySqrt = function(x) {
    if(x == 0 || x == 1) return x;
    let i = 0, j = Math.floor(x / 2) + 1, mid = 0, tmp = 0;
    while(i <= j){
        mid = Math.floor((i + j) / 2);
        tmp = mid * mid;
        if(tmp == x) return mid;
        else if(tmp < x) i = mid + 1;
        else j = mid - 1;
    }
    return j;
};
  • 牛顿迭代法: 待理解:
//C

int mySqrt(int x) {
        if (x == 0) return 0;
        double last=0;
        double res=1;
        while(res!=last)
        {
            last=res;
            res=(res+x/res)/2;
        }
        return int(res);
    }

  

原文地址:https://www.cnblogs.com/JesseyWang/p/13088621.html