leetcode_069 Sqrt(x)

题目分析:求一个整数的平方根,如果此整数平方个不为整数,则返回其整数部分。

解题思路:方法一:利用牛顿迭代法实现。

                            具体:迭代公式为:x(i+1) = (x(i) + n / x(i)) / 2。计算过程中利用递归即可。

                            方法二:利用折半查找实现。

                            具体:每次取中间值n^2与x比价,若小于,则取右边的中间值再进行比较,若小于,则取左边中间

                                        值再进行比较。

class Solution
{
	public:
		// 方法一:牛顿迭代法实现 
		int mySqrt(int x)
		{
			if(x < 0)
				return -1;
			if(x == 0)
				return 0;
			else
			{
				double x2 = 1;
				double x1;
				do
				{
					x1 = x2;
					x2 = (x1 + x / x1) / 2;
				}while(abs(x2 - x1) > 0.00001);
				return (int)x2;
			}
		}
		//方法二:利用折半查找 
		int mySqrt2(int x)
		{
			if(x < 0)
				return -1;
			if(x == 0)
				return 0;
			int first = 1;
			int last = x / 2 + 1;
			int mid;
			while(first <= last)
			{
				mid = (first + last) / 2.0;
				if(mid * mid == x )
					return (int)mid;
				if((x / mid >= mid) && ((mid + 1) > x / (mid + 1)))
					return mid;
				else if(x / mid < mid)
					last = mid - 1;
				else
					first = mid + 1;
			}
			return -1;
		}
};

下面是使用python实现的程序

class Solution:
    def mySqrt(self, x):
        if (x <= 1):
            return x
        n = x >> 1
        first = 0
        last = x
        while first < last - 1:
            s = n * n
            if (s < x):
                first = n
                n += (last - first) >> 1
            elif (s > x):
                last = n
                n -= (last - first) >> 1
            else:
                return n
        return n if n * n <= x else n - 1





评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值