难度:medium
题目描述:
实现函数 int sqrt(int x)。计算并返回x的平方根
示例:输入2,输出1.
思路:
这道题和C语言教材的那道题一样的。
用牛顿迭代法。
要求X的平方根,那么必然存在一个实数N,使得N*N = X,所以可以转化为求函数f(x)=N²-X的零点问题。 在曲线f(x)上,设N为f(x)=0的正根,那么设一个临近正根N的数r(为了方便就直接设r等于X)在r值对应的曲线上的点作切线,交X轴于新的一点r_new,此时r_new逐渐逼近正确零点值N,然后再在r_new值对应的曲线上的点作切线,又交X轴于新的一点r_new_new,此时r_new_new逐渐逼近正确零点值N...然后这样一直迭代下去,直到逼近正确值。如下图所示:
(图来自网络,侵删)
代码:
import java.util.*;public class Solution { public int sqrt (int x) { //0和1特殊情况单独拿出来判断 if(x == 0 || x == 1){ return x; } //先设一个接近正确根的数r,为方便直接设等于x/2,减少迭代次数 long r = x/2; //当r²>x的时候说明还没有找到 while(r * r > x){ //那么利用牛顿迭代公式求出新的x值进行迭代 //推导见最后 r = (r + x / r) / 2; } //当r²<=x的时候说明找到了直接返回 //根据示例直接返回的是整型 return (int) r; }}//r = (r + x / r) / 2 公式来源://f(r)=r*r-x (其中r为变量,x为常量)//根据牛顿迭代共公式://r_new = r - f(r)/f'(r)//f'(r) = 2r//r_new = r - (r*r-x)/2r//r_new = r - r/2 + x/2r//r_new = r/2 + x/2r = (r + x / r) / 2