You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何用Python bisect求完全平方根并判断是否为完全平方数?

解决bisect求平方根时的准确值判断问题

原来的代码通过bisect_left找到的是第一个满足v*v >= num的整数位置,但无法区分该位置的平方是否恰好等于输入值。要实现“找到准确平方根返回对应整数,否则返回-1/None”的需求,只需在拿到bisect的结果后增加一步验证即可。

修改后的代码

import bisect

def squareRootUsingBisect(num):
    if num == 0:
        return 0
    # 用range替代列表,节省内存(Python 3.10+支持key参数)
    idx = bisect.bisect_left(range(num + 1), num, lo=0, hi=num, key=lambda v: v*v)
    # 验证找到的数的平方是否等于原数
    return idx if idx * idx == num else -1

# 测试用例
print(squareRootUsingBisect(169))  # 输出:13
print(squareRootUsingBisect(170))  # 输出:-1
print(squareRootUsingBisect(0))    # 输出:0
print(squareRootUsingBisect(1))    # 输出:1
print(squareRootUsingBisect(25))   # 输出:5
print(squareRootUsingBisect(26))   # 输出:-1

关键说明

  • bisect_left的作用是找到第一个让key(v) >= num的位置,对于非完全平方数,这个位置的平方会大于输入值,因此需要验证idx*idx == num来确认是否是准确的平方根。
  • 用range(num+1)代替list(range(0,num))可以避免生成大列表,提升内存效率,尤其当num取值很大时效果明显。
  • 如果需要返回None而非-1,只需把返回语句改成return idx if idx * idx == num else None即可。

内容的提问来源于stack exchange,提问作者Rnj

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.25 21:27:26