题目描述
实现 int sqrt(int x) 函数。
计算并返回 x 的平方根,其中 x 是非负整数。
由于返回类型是整数,结果只保留整数的部分,小数部分将被舍去。
示例 1:
输入: 4
输出: 2
示例 2:
输入: 8
输出: 2
说明: 8 的平方根是 2.82842…,
由于返回类型是整数,小数部分将被舍去。
注:如只需要解本题,代码如下:
class Solution {
int mySqrt(int x)
{
if(x==0||x==1)
return x;
double x0=x;
double t=x;
x0=x0/2+t/(2*x0);
while(Math.abs(x0*x0-t)>0.1)
{
x0=x0/2+t/(2*x0);
}
return (int)x0;
}
}
这里我做了一些扩展,返回小数点后十位的平方根,有需要请自改。
题解
牛顿迭代法中,首先给定一个初始值X0,然后,通过这个初始值作函数的切线,与y=0交于一点,横坐标为x1, 在通过点(x1,f(x1))作函数的切线,与y=0交于点(横坐标为x2),这样一直下去,得到xn(若把xn代入方程得到的值与函数实际的值小于某一个很小的阈值,则我们认为xn就是函数的解)
故要求解sqrt(x),即求解sqrt(t)(t=x), 即求函数 f(x)=x2−t=0的解,我们给初始解赋一个初始值x0, 那么我们在点(x0,f(x0))处对曲线作切线, 得到如下方程y−f(x0)=f(x0)′(x−x0),令y=0, 解得x=x0/2+t/(2x0), 则迭代的解x1=x0/2+t/(2x0),像这样依次迭代xn=xn−1/2+t/(2xn−1), 若f(xn)很接近于0(与0的差绝对值小于某个阈值),这迭代终止,xn即为函数的解。
static double mySqrt(int x)
{
if(x==0||x==1)
return x;
double x0=x;
double t=x;
x0=x0/2+t/(2*x0);
while(Math.abs(x0*x0-t)>0.0000000001)
{
x0=x0/2+t/(2*x0);
}
DecimalFormat df = new DecimalFormat("#.###########");
return Double.parseDouble(df.format(x0));
}