1.题目
实现 int sqrt(int x) 函数。
计算并返回 x 的平方根,其中 x 是非负整数。
由于返回类型是整数,结果只保留整数的部分,小数部分将被舍去。
1.1 牛顿法
假设求a的平方根
a
=
x
\sqrt a=x
a=x,即求方程
x
2
−
a
=
0
x^2-a=0
x2−a=0 的解
牛顿法迭代公式为:
x
n
+
1
=
x
n
−
f
(
x
n
)
f
′
(
x
n
)
x_{n+1}=x_{n}-\frac{f\left(x_{n}\right)}{f^{\prime}\left(x_{n}\right)}
xn+1=xn−f′(xn)f(xn)
# f(x)导数
def delta(x):
return 2*x
# f(x)
def f(x, a):
return x**2-a
def getSqrt(x):
if x == 0 or x == 1:
return x
# 精确到三位小数
epsilon = 1e-3
temp = x
while True:
pre = x
x = x-f(x, temp)/delta(x)
if abs(pre-x)<epsilon:
break
print(round(x, 3))
getSqrt(3)
输出:
1.732
1.2 二分法
# 二分法
def mySqrt(x: int) -> int:
left = 0
right = x
if x == 0 or x == 1:
return x
epsilon = 1e-3
while abs(right**2-x) > epsilon:
mid = (left+right)/2
if mid*mid < x:
left = mid
elif mid*mid > x:
right = mid
else:
break
print(round(right, 3))
mySqrt(2)