Python算法:判断平方数与求平方根

判断平方数

1、问题描述

给定一个正整数num ,判断是否为完全平方数,要求当num为完全平方数时返回True,否则返回False

2、问题示例

输入num=16,输出True,sqrt(16)=4;输入num=15,输出False,sqrt(15)=3.87。

3、代码实现

# 参数 num 是一个正整数
# 返回值时一个布尔值,如果num是完全平方数就返回True,否则返回False。
class Solution():
	def isPerfectSquare(self, num):
		l = 0 
		r = num
		while (l - r > 1): # 当左值l 与右值r 是非相邻数字时:
			mid = ( l + r ) / 2  # 取中值
			if (mid * mid <= num): # 如果mid的平方数小于或者等于num,表示我们要找的数比这个数大
				l = mid # 缩小范围,为了寻找更大的数
			else: # 如果mid的平方数大于num,表示我们要找的那个数比这个数小
				r = mid # 为了寻找更小的数
		ans = l # 如果存在mid*mid=num,则会将mid赋值给l,所以ans的初始值为l
		if (l * l < num): # 但如果l*l的值小于num,代表我们要找的数可能是r
			ans = r
		return ans * ans == num # 如果找到了平方数,则返回True

if __name__ == '__main__':
	num = 16
	print("initial value: ", num)
	solution = Solution()
	print("result: ", solution.isPerfectSquare(num))

4、运行结果

initial value: 16
result: True

5、分析

本人觉得这个算法可能包含两种思维:1、二分法;2、极限

  1. 二分法:取中值的方法可以更快地进行序列查找
  2. 极限:作为二分查找的终止条件,当二分法左右两个基数的距离小于1时,题目所需的正整数已经被遍历完毕。

求平方根

1、问题描述

实现 int sqrt(int x)函数,计算并返回 x 的平方根。

2、 问题示例

sqrt(3) = 1; sqrt(4) = 2; sqrt(5) = 2; sqrt(10) = 3;

3、代码实现

class Solution():
    def _sqrt(self, x):
        # 设置左右两个数 分别为0与x
        l, r = 0, x
        # 循环直至 l 与 r 是相邻的两个数
        while l + 1 < r:
            # 地板除 向下取整 m为中位数
            m = (r + l) // 2
            if m * m == x:
                return m
            # 如果m的平方大于x,代表我们要找的数在m左方
            elif m * m > x:
            # 所以将右边的数赋值为m,缩小范围
                r = m
            else:
                l = m
        # 退出循环时,l与r为相邻的数。
        if l * l == x:
            return l
        if r * r == x:
            return r
        # 如果都不是则取l返回(一定小于x)
        return l

if __name__ == '__main__':
    temp = Solution()
    x1 = 16
    x2 = 10
    print("输入:" + str(x1))
    print("输出:" + str(temp._sqrt(x1)))
    print("输入:" + str(x2))
    print("输出:" + str(temp._sqrt(x2)))
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值