题目描述:
给定一个正整数 num
,编写一个函数,如果 num
是一个完全平方数,则返回 true
,否则返回 false
。
示例:
输入: 16
输出: true
输入: 14 输出: false
解题思路:
判断一个数是否为完全平方数,可以通过以下几种方法:
方法一:直接开平方
- 计算平方根:使用
sqrt
函数计算num
的平方根。 - 判断平方根是否为整数:如果平方根的整数部分平方后等于
num
,则num
是完全平方数。
代码实现:
import math
def isPerfectSquare(num): sqrt_num = math.sqrt(num) return int(sqrt_num) ** 2 == num
示例
print(isPerfectSquare(16)) # 输出: true print(isPerfectSquare(14)) # 输出: false
方法二:二分查找
- 初始化边界:设置左边界
left
为 1,右边界right
为num
。 - 二分查找:在
left
和right
之间进行二分查找,计算中间值mid
,判断mid * mid
与num
的关系。- 如果
mid * mid == num
,则num
是完全平方数。 - 如果
mid * mid < num
,则调整左边界left = mid + 1
。 - 如果
mid * mid > num
,则调整右边界right = mid - 1
。
- 如果
- 结束条件:当
left
超过right
时,结束循环。
代码实现:
def isPerfectSquare(num):
left, right = 1, num
while left <= right:
mid = (left + right) // 2
if mid mid == num:
return True
elif mid mid < num:
left = mid + 1
else:
right = mid - 1
return False
示例
print(isPerfectSquare(16)) # 输出: true print(isPerfectSquare(14)) # 输出: false
方法三:牛顿迭代法
- 初始化:设置初始值
r = num
。 - 迭代计算:使用牛顿迭代公式
r = (r + num / r) / 2
,直到r * r
与num
的差值小于等于 1。 - 判断结果:如果
r * r == num
,则num
是完全平方数。
代码实现:
def isPerfectSquare(num):
r = num
while r r > num:
r = (r + num // r) // 2
return r r == num
示例
print(isPerfectSquare(16)) # 输出: true print(isPerfectSquare(14)) # 输出: false
总结:
- 直接开平方 方法简单直观,但依赖
sqrt
函数,可能存在精度问题。 - 二分查找 方法不依赖库函数,时间复杂度为
O(log n)
,适合大数处理。 - 牛顿迭代法 方法效率高,迭代次数少,适合快速计算。
根据具体需求选择合适的方法即可。希望这些解答对你有所帮助!如果有更多问题,欢迎继续提问。
发表回复