判断平方数
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时,题目所需的正整数已经被遍历完毕。
求平方根
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)))