69.x的平方分根

题目

实现 int sqrt(int x) 函数。

计算并返回 x 的平方根,其中 x 是非负整数。

由于返回类型是整数,结果只保留整数的部分,小数部分将被舍去。

示例 1:

1
2
输入: 4
输出: 2

示例 2:

1
2
3
4
输入: 8
输出: 2
说明: 8 的平方根是 2.82842...,
由于返回类型是整数,小数部分将被舍去。

思路

这道题看似简单,但是非常有意思,普通解法可以使用二分法来进行计算,但是这里使用一个更好用的解法:牛顿迭代法,通过逼近斜率来得到方程的解.

代码

1
2
3
4
5
6
7
8
9
10
11
12
13
public int MySqrt(int x)
{
if (x <= 1)
{
return x;
}
double r = x;
for (int i = 0; i < 20; i++)//迭代次数,次数越多越精确.
{
r = (r + x / r) / 2;//牛顿迭代法的关键,建议直接背下来.
}
return (int)r;
}