x的平方根

x的平方根

 

 

 详细思路

二分,找到中间,比较mid*mid和x,如果mid*mid<=x并且mid+1*mid+1>x答案,退出
 
精确定义
left第一个数
right最后一个数
mid需要判断
class Solution {
public:
    int mySqrt(int x) {
        int left=1,right=x,ans=0;
        while(left<=right){
            int mid=left+(right-left)/2;
            if(mid<=x/mid&&(mid+1)>x/(mid+1)){
                ans=mid;
                break;
            }
            else if(mid<x/mid)left=mid+1;
            else right=mid-1;
        }
        return ans;
    }
};
踩过的坑,要么longlong要么乘法变成除法
x/mid
class Solution {
public:
    int mySqrt(int x) {
        int left=1,right=x,ans=0;
        while(left<=right){
            int mid=left+(right-left)/2;
            if((long long)mid*mid<=x&&(long long)(mid+1)*(mid+1)>x){
                ans=mid;
                break;
            }
            else if((long long)mid*mid<x)left=mid+1;
            else right=mid-1;
        }
        return ans;
    }
};
fabs求浮点绝对值,abs求整数绝对值
 
牛顿迭代法是二次收敛的
画图x的平方根

 

 

详细定义
xi为当前需要判断,x0为上一个接近的点,通过切线算出xi,如果x0-xi<1e-7(一个极小的非负数),就可以认为x0的整数部分就是答案
class Solution {
public:
    int mySqrt(int x) {
        if(x==0)return 0;
        double x0=x,c=x;
        while(1){
            double xi=(c/x0+x0)/2.0;
            if(x0-xi<1e-7)break;
            x0=xi;
        }
        return (int)x0;
    }
};

 

 

x的平方根

上一篇:JAVA-多线程 三 {多线程状态}JAVA从基础开始 -- 3


下一篇:layui form里的select元素动态赋值无效