Implement int sqrt(int x).

自己设计函数,实现求根号。x是非负整数。

 

Input: 8

Output: 2

当开出根号后有小数,则省略小数部分。。

思路:只要找到一个数a,a*a<=x而且(a+1)*(a+1)>x,则a就是开根号后的结果。

这里要注意a*a因为<=x,不会溢出,但是(a+1)*(a+1)则可能会导致溢出。一种解法就是将两者结果比较,后者小于前者,说明后者溢出了(则后者应该肯定大于x),这是返回a就行。还有一种就是改写上面不等式,将乘号除到右边,变成除,就不会出现溢出。见代码

解法1:暴力解法。

 

  public int mySqrt(int x) {
        if(x==0) return 0;
       for(int i=1;i<=x;i++){
          //防止溢出
            if(i<=x/i&&(i+1)>x/(i+1)) return i;
        }
        return 0;
    }

 

 

解法二:利用二分查找。

 

class Solution {
    public int mySqrt(int x) {
        if(x==0) return 0;
        //二分查找
        int left=1,right=x;
        while(left<right){
            int mid=(left+right)/2;
      //在二分查找中加入一个判断
if(mid<=x/mid&&(mid+1)>x/(mid+1)) return mid; else if(mid>x/mid) right=mid-1; else left=mid+1; } return left; } }

 

posted on 2017-12-19 21:23  夜的第八章  阅读(142)  评论(0编辑  收藏  举报

导航