给你一个非负整数 x ,计算并返回 x 的 算术平方根 。
由于返回类型是整数,结果只保留 整数部分 ,小数部分将被 舍去 。
注意:不允许使用任何内置指数函数和算符,例如 pow(x, 0.5) 或者 x ** 0.5 。
解法:使用牛顿迭代法求解
我们用C表示是待求出平方根的那个整数,C的平方根就是函数y=f(x)=x^2-C的零点。
牛顿迭代法本质是借助泰勒级数,从初始值开始快速向零点逼近。我们任取一个x0作为初始值,在每一次的迭代中,我们找到函数图像上的点(xi,f(xi)),过这点我们可以画出一个切线,斜率为f(xi)',与横轴的交点记位xi+1,xi+1比xi更接近零点。经过迭代后,我们可以得到一个距离零点很近的交点。
我们选择x0=C作为初值
y-(xi^2-C)=2xi(x-xi)
令y=0,可以得出xi+1=0.5*(xi+C/xi)
class Solution {
public:
int mySqrt(int x) {
//牛顿迭代法
if(x==0)
return 0;
double C=x,x0=x;
while(true)
{
double xi=0.5*(x0+C/x0);
if(fabs(xi-x0)<1e-7)
break;
x0=xi;
}
return int(x0);
}
};