代码测试的问题去哪里问?
x是正整数
def find_square_root(x):
lo = 0
hi = x
while lo < hi:
mid = (lo + hi) // 2 #
if mid ** 2 == x:
lo = mid
return lo
if mid ** 2 < x:
lo = mid + 1
if mid ** 2 > x:
hi = mid
print(f"mid={mid}, lo={lo}, hi={hi}")
return lo - 1
测试
In [5]: find_square_root(10)
mid=5, lo=0, hi=5
mid=2, lo=3, hi=5
mid=4, lo=3, hi=4
mid=3, lo=4, hi=4
Out[5]: 3
In [6]: find_square_root(80)
mid=40, lo=0, hi=40
mid=20, lo=0, hi=20
mid=10, lo=0, hi=10
mid=5, lo=6, hi=10
mid=8, lo=9, hi=10
mid=9, lo=9, hi=9
Out[6]: 8
这个解法有问题, 但找不到那个edge case.
退出条件是 lo == hi
当最后剩下两个相邻的数值, lo, hi
mid = (lo + hi) // 2, 因为是floor div, mid = lo;
当mid ** 2 < x, hi = mid = lo,
这种情况下没有问题, 因为lo被测试了.
但是当 mi**2 > x; lo = mid + 1, 在lo = hi = mid +1的时候, hi 这个点位没有被测试,.
找不到这样一个值, 求助.