首页 > 试题广场 >

求平方根

[编程题]求平方根
  • 热度指数:154668 时间限制:C/C++ 1秒,其他语言2秒 空间限制:C/C++ 256M,其他语言512M
  • 算法知识视频讲解
实现函数 int sqrt(int x).
计算并返回 x 的平方根(向下取整)

数据范围:
要求:空间复杂度 ,时间复杂度
示例1

输入

2

输出

1
示例2

输入

2143195649

输出

46294
class Solution {
public:
    int sqrt(int x) {
        int r = x;
        while(r*r > x)
        	r = (r + x/r)>>1;
        return r;
    }
};

发表于 2017-08-28 00:59:11 回复(1)
emm我知道我很菜
import java.util.*;


public class Solution {
    /**
     * 
     * @param x int整型 
     * @return int整型
     */
    public int sqrt (int x) {
        // write code here
        //return (int) Math.sqrt(x);
        for(int i = 0; i <= x; i++){
            if(i * i > x){
                return i - 1;
            }
            if(i * i == x){
                return i;
            }
        }
        return 0;
    }
}

编辑于 2021-12-13 15:19:03 回复(1)
class Solution {
public:
    /**
     * 
     * @param x int整型 
     * @return int整型
     */
    int sqrt(int x) {
        int i=0;
        for(i>=0;;)
        {
            if(i*i<=x && (i+1)*(i+1)>x)
                return i;
            i++;
        }// write code here
    }
};
发表于 2021-11-15 18:28:50 回复(0)
class Solution:
    def sqrt(self , x ):
        # write code here
        if x==0:
            return 0
        if x==1:
            return 1
        if x ==2:
            return 1
        else:
            lower = 0
            ans = 0
            upper = x
            while True:
                mid = (upper - lower) // 2 + lower
                if mid * mid <= x:
                    if (mid + 1) * (mid + 1) > x:
                        ans = mid
                        return ans
                    else:
                        lower = mid
                else:
                    upper = mid
mark
发表于 2021-10-13 12:28:57 回复(0)
二分法
import java.util.*;


public class Solution {
    /**
     * 
     * @param x int整型 
     * @return int整型
     */
    public int sqrt (int x) {
        int l = 0, r = x;
        while(l <= r){
            int mid = (l+r) >> 1;
            long tem = (long)mid * mid;
            if(tem > x){
                r = mid - 1;
            }else if(tem < x){
                l = mid + 1;
            }else{
                return mid;
            }
        }
        return r;
    }
}


发表于 2021-10-03 20:33:03 回复(0)
关键注意溢出
int sqrt(int x) {      
        int l=0,r=x;long long mid;
        while(l<=r){
            mid=(l+r)/2;
            if(mid*mid==x) return mid;
            else if(mid*mid<x) l=mid+1;
            else r=mid-1;
        }
        
        if(mid*mid>x) mid--;
        return mid;
    }
};

发表于 2021-08-25 20:21:22 回复(0)
Python
牛顿法求平方根公式:
    其中x为目标平方根, n为输入数
#
# 
# @param x int整型 
# @return int整型
#
class Solution:
    def sqrt(self , x ):
        # write code here
#         二分查找
#         if x==1 or x==0:
#             return x
#         high = x
#         low = 0
#         mid = (high+low)/2
#         while abs(mid*mid - x) > 0.01:
#             if mid*mid>x:
#                 high,mid = mid,(high+low)/2
#             else:
#                 low,mid = mid,(high+low)/2
#         return int(mid)
#         牛顿法
        if x==1 or x==0:
            return x
        sqr = x/2
        while abs(sqr*sqr - x)>0.01:
            sqr = (sqr+x/sqr)/2
        return int(sqr)
        
        
        


编辑于 2021-04-19 12:13:25 回复(0)
解题思路:使用二分法
import java.util.*;

public class Solution {
    /**
     * 
     * @param x int整型 
     * @return int整型
     */
    public int sqrt (int x) {
        // write code here
        //使用二分法
        if (x== 0)
            return 0;
        int left = 1, right = x;
        while(true){
            int mid=left+(right-left)/2;
            if(mid>x/mid){
                right=mid-1;
            }else{
                if((mid+1)>x/(mid+1))
                    return mid;
                left=mid+1;
            }
        }
    }
}
发表于 2021-03-14 20:29:35 回复(0)

牛顿迭代法

class Solution:
def sqrt(self , x ):
# write code here
if x==0:
return 0
C,x0=x,x
while True :
xi=0.5*(x0+C/x0)
if abs(x0-xi)<1e-7 :
break
x0=xi
return int(x0)
编辑于 2020-11-07 16:56:43 回复(0)
分治法就是二分法的思想解决问题,通过进行判断所求值和mid的关系,来进行左右的递归查找,只是在最后返回结果中需要注意,因为low对应的值可能也大于我们要求的值,所以最后还有一个判断,如果大于的话,a就减去1作为根值
class Solution:
    def equal(self,low,high,m):
        if low>=high:
            return low
        mid=(high-low)//2+low
        if mid**2==m:
            return mid
        elif mid**2<m:
            return self.equal(mid + 1, high, m)
        else:
            return self.equal(low, mid - 1, m)
    def sqrt(self , x ):
        # write code here
        if x<=0:
            return 0
        low=1
        high=x
        a=self.equal(low,high,x)
        if a**2>x:
            a-=1
        return a


发表于 2020-07-18 21:07:59 回复(0)

可采用二分法,但是需要注意溢出问题。

class Solution {
public:
    /**
     * 
     * @param x int整型 
     * @return int整型
     */
    int sqrt(int x) {
        int l = 0, r = x;
        while (l < r) {
            int mid = l + ((r - l) >> 1);
            long long tmp = 1LL * mid * mid;  // 注意溢出,因此采用 long long
            if (tmp < x) {
                if ((mid + 1) * (mid + 1) > x) {
                    return mid;
                }
                l = mid + 1;
            } else {
                r = mid;
            }
        }
        return l;
    }
};
发表于 2020-09-03 19:24:40 回复(0)
class Solution {
public:
    int sqrt(int x) {
        return pow(x,0.5);
    }
};

发表于 2019-05-17 10:18:46 回复(1)
#

# @param x int整型 
# @return int整型
#
import math
class Solution:
    def sqrt(self , x ):
        # write code here
        return math.floor(math.sqrt(x))
发表于 2021-07-25 16:16:33 回复(5)
看了一圈很少有用python求解的,而且步骤很简洁的,那我就来贡献下啦:
根据,平方数的性质-连续n个奇数相加的结果一定是n的平方数。so
我们代码入下:
class Solution:
    def sqrt(self , x ):
        # write code here
        #根据平方数的性质-连续n个奇数相加的结果一定是n的平方数
        k=1
        num=0
        while (x>=0):
            x-=k
            k+=2
            num+=1
        return num-1

发表于 2021-01-23 22:32:01 回复(0)

Java解法

解法一:可以直接使用库……

public class Solution {
    public int sqrt(int x) {
        return (int) Math.sqrt(x);
    }
}

解法二:根据平方数的性质——连续n个奇数相加的结果一定是平方数。

如:9=1+3+5;

16=1+3+5+7;

所以,不断的进行奇数相加,并判断x大小即可。代码如下:

public class Solution {
    public int sqrt(int x) {
        int i = 1;
        int res = 0;
        while (x >= 0) {
            x -= i;
            res++;
            i += 2;
        }
        return res - 1;
    }
}
发表于 2018-07-04 09:43:41 回复(11)
class Solution {
public:
    int sqrt(int x) {//思路用二分法
        if (x < 2)
            return x;
        int left = 1, right = x / 2;    //右端从x/2开始
        int mid, last_mid;
        
        while (left <= right) {
            mid = left + (right - left) / 2;
            if (x / mid > mid) {	//不用x > mid * mid 会溢出
                left = mid + 1;
                last_mid = mid;
            }
            else if (x / mid < mid)
                right = mid - 1;
            else 
                return mid;
        }
        return last_mid;
    }
};

发表于 2016-09-08 10:06:04 回复(5)
public class Solution {
    public int sqrt(int x) {
		int low = 0;
		int high = x;
		while (low <= high) {
			long mid = (low + high) / 2;
			if(mid * mid == x) return (int)mid;
			else if(mid * mid < x) low = (int)(mid + 1);
			else high = (int)(mid - 1);
		}
		return high;
	}
}

发表于 2016-11-18 14:36:15 回复(7)
public class Solution {
    //牛顿法思路:
    //r = sqrt(x),即r*r = x
    //故有f(r) = r*r-x = 0 这里注意r是变量,x是常数
    //按照牛顿迭代法公式 r_new = r_old + f(r)/f'(r)
    //得 r_new = (r_old+x/r_old)/2
    //一般,牛顿法是当 一次迭代的变化量足够小时就停止迭代
    //这里利用了f(r)的特征,将r初始化为x,可以画图查看,r的初始值在sqrt(x)的右半边
    //在循环内的迭代过程中,r始终在sqrt(x)的右半边。直到退出循环得出答案
    public int sqrt(int x) {
        if(x==0 || x==1) return x;
        long r = x; 
        while(x/r<r)//即r*r>x
            r = (r+x/r)/2;
        //此时r*r<=x 即为答案
        return (int)r;
    }
}

发表于 2019-04-16 20:59:30 回复(3)
//	public static int sqrt(int x) {
//        return (int)Math.sqrt(x);
//    }
但是题的意思不是用这个
特比特别要注意两点:第一right要取x/2+1  这个还不是最重要的,其实只是影响速度
第二:要用x/middle>middle  来表示x>middle*middle  不然会溢出
第三:判断相等时用x/middle>=middle && x/(middle+1)<(middle+1)
public static int sqrt(int x) {
		if(x==0){
			return 0;
		}
		if(x<0){
			return -1;
		}
		int left = 1,right = x/2+1,middle ;
		while(left<=right){
			middle = (left+right)/2;
			if(x/middle>=middle && x/(middle+1)<(middle+1)){
				
				
				return middle;
			}else if(x/middle>middle){
				left = middle+1;
			}else{
				right = middle-1;
			}
		}
		return right;
	}

发表于 2016-03-13 17:42:58 回复(0)
public class Solution {
    public int sqrt(int x) {
		if (x== 0)
			return 0;
		int left = 1, right = x;
		while (true) {
			int mid = left + (right - left) / 2;
			//这里判断不用if (mid * mid > x),因为使用mid > x / mid一定会有结果
			if (mid > x / mid)
				right = mid - 1;
			else {
				if(mid+1>x/(mid+1))
					return mid;
				left=mid+1;
			}
		}
	}
}

发表于 2017-07-30 11:28:47 回复(0)

问题信息

难度:
186条回答 26245浏览

热门推荐

通过挑战的用户

查看代码