x的平方根

题目描述

实现 int sqrt(int x) 函数。计算并返回 x 的平方根,其中 x 是非负整数。

解题思路

看到这个题,当时想到了利用二分法,查找x的平方根。写出了如下代码

public int mySqrt(int x) {
		if(x<0)
			return -1;
		if(x == 0 || x ==1)
			return x;
		int l = 1, h = x;
		while(l < h ) {
			int m = l + (h-l) /2;
			if(m*m == x || (m * m < x && (m+1)*(m+1) >x)) {
				return m;
			}
			else if(m * m > x || m*m <0) {	//平方根比m小,取值为l到m-1,		
				h = m-1;
			}else {
				l = m+1;
			}
		}
		return l;
	}

但是这个方法并不适用大数,因为mm有可能会溢出,则得到的负数,因此加入判断条件(mm<0),但这依然有可能溢出太严重,变成了一个正数,因此想到利用除法或者将int类型转换为long计算,可以防止溢出,将上述代码转换为long改为:

public int mySqrt(int x) {
        if(x<0)
			return -1;
		if(x == 0 || x ==1)
			return x;
		long l = 1, h = x;
		long t = x;
		while(l < h ) {
			long m = l + (h-l) /2;
			if(m*m == x || (m * m < x && (m+1)*(m+1) >x)) {
				return (int)m;
			}
			else if(m * m > x) {	//平方根比m小,取值为l到m-1,		
				h = m-1;
			}else {
				l = m+1;
			}
		}
		return (int)l;
    }

改为除法的代码:

public int mySqrt(int x) {
       if (x <= 1) {
       	return x;
   	   }
       int l = 1, h = x;
       while (l <= h) {
           int mid = l + (h - l) / 2;
           int sqrt = x / mid;
           if (sqrt == mid) {
               return mid;
           } else if (mid > sqrt) {
               h = mid - 1;
           } else {
               l = mid + 1;
           }
       }
   	return h;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值