数值计算:牛顿迭代法(x的平方根)

1、牛顿迭代法

  • 牛顿迭代法一般是用来计算非线性方程的根的(当然线性的肯定也可以)
  • 牛顿迭代法就是通过不断的迭代,不断的拿到一个点(Xn+1)的切线与x轴的交点(Xn),再对应到曲线上横坐标为Xn 的点,再找到该点的切线与x轴的交点(Xn-1)... ...如此循环往复,迭代下去

数值计算:牛顿迭代法(x的平方根)_第1张图片

2、例题:力扣69:x的平方根

给你一个非负整数 x ,计算并返回 x 的 算术平方根

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

注意:不允许使用任何内置指数函数和算符,例如 pow(x, 0.5) 或者 x ** 0.5 。

提示:

  • 0 <= x <= 231 - 1

数值计算:牛顿迭代法(x的平方根)_第2张图片

  • 这道题给的评级是简单,但是通过率没有很高,我觉得通过率不高的原因应该是因为两个int类型的变量相乘,导致最后溢出,这个放在最后讲。

示例 1:

输入:x = 4 输出:2

示例 2:

输入:x = 8 输出:2 解释:8 的算术平方根是 2.82842..., 由于返回类型是整数,小数部分将被舍去。

3、分析

数值计算:牛顿迭代法(x的平方根)_第3张图片

  • 这道题我看到有用二分法做的,一次砍一半
  • 但是我在这里就不写二分法的代码啦

4、完整代码

class Solution {
    public int mySqrt(int x) {
        if(x==1) return 1;
        long mid = x/2;
        while(mid * mid > x){   
            mid = ((mid * mid)+x)/(2*mid);
        }
        return (int)mid;
    }
}

5、可能会出错的原因

  • 由于 int 和 int 相乘最后的乘积类型还是int ,所以当两个很大的int类型的数相乘时,其乘积自然要超过int ,所以就会导致溢出。
  • 解决办法就是:将相乘的两个int 类型的数值转换为long 类型,最后就是两个long 类型的在相乘,其结果自然就是long 类型,所以就不会溢出!

你可能感兴趣的:(杂七杂八的算法,算法,leetcode,职场和发展,数据结构,java)