# -*- coding: utf-8 -*-
'''
Python程序员面试算法宝典---解题总结: 第6章 基本数字运算 6.13 如何在不能使用库函数的条件下计算n的平方根
题目:
给定一个数n,求出它的平方根,比如16的平方根是4.要求不能使用库函数。
分析:
最简单的方式,就是n进行累加,每次计算i*i <= n, (i+1)*(i+1) > n,
则i就是数字n的平方根。
为了能快速增加i的值而不是每次加1,
可以选择,二分查找,限定查找范围是0~n/2
关键:
1 二分查找尤其需要注意一种情况
while low < high:
low = high - 1
此时会造成无限循环,
当low = high - 1 需要跳出循环再计算
2 书上解法
通过近似值获取。第一个近似值为1,接下来的近似值通过
Ai+1 = (Ai + n/Ai)/2
为什么?
3 没有想到
没有想到公式:
Ai+1 = (Ai + n/Ai)/2
参考:
Python程序员面试算法宝典
'''
def isOk(i, n):
value = i * i
value1 = (i + 1) * (i + 1)
# 找到了,返回结果
if value <= n and value1 > n:
return True
else:
return False
def rootOfN(n):
if n < 0:
return -1
low = 0
high = n / 2 + 1
while low < high:
diff = high - low
mid = diff / 2 + low
value = mid * mid
value1 = (mid + 1) * (mid + 1)
# 找到了,返回结果
if isOk(mid, n):
return mid
if value < n:
low = mid
elif value > n:
high = mid - 1
# 存在一种情况, low = 0, high=1, 则mid=1,新的low=1,一直陷入死循环,
# 所以一旦low = high - 1,直接跳出循环
if low == high - 1:
break
if isOk(low, n):
return low
if isOk(high, n):
return high
return -1
# 其中e是精度
def squareRoot(n, e):
newOne = n
lastOne = 1.0 # 第一个近似值
while newOne - lastOne > e:
newOne = (newOne + lastOne) / 2
lastOne = n / newOne
return newOne
def process():
# for i in range(0, 27):
# result = rootOfN(i)
# print results
e = 0.000001
for i in range(0, 27):
result = squareRoot(i, e)
print result
if __name__ == "__main__":
process()