世界已冷酷至极, 让我们携手前行。
自助收录

使用牛顿迭代算法解决“x的平方根”问题

算法刷题2年前 (2023)更新 江南白衣
323 0 0
使用牛顿迭代算法解决“x的平方根”问题

题目:x的平方根
描述:在不使用 sqrt(x) 函数的情况下,得到 x的平方根的整数部分。
重点考察:二分法、牛顿迭代
思路:
前面我们分别使用了暴力算法二分查找算法找到了x的平方根的整数,这次我们用牛顿迭代算法。其实这道题想考察的也是牛顿迭代算法,因为这种算法的复杂度比前面两者低,效率更好,当然也比较难,需要用到大学里学到的微积分,通过几何的角度解决这个问题。x=n的平方,那么x/n = n,实际上我们就是要求出x/n与n之间的均值。在以前的解题思路中我们举过12的分乘这个例子,其中3 x 4是个特殊的点,因为在此之后,两个因子就交换了位置,那么12的平方根一定就在3和4之间。
12的分乘:
1 x 12 = 12;
2 x 6 = 12;
3 x 4 = 12;
√12 x √12 = 12;
4 x 3 = 12;
6 x 2 = 12;
12 x 1 = 12;
假设平方根是 i ,则 i 和 x/i 必然都是x的因子,而 x/i 必然等于 i ,推导出 i + x / i = 2 * i,得出 i = (i + x / i) / 2。由此得出解法,i 可以任选一个值,只要上述公式成立,i 必然就是x的平方根,如果不成立, (i + x / i) / 2得出的值进行递归,直至得出正确解。

package od;

/**
 * x的平方根(牛顿迭代)
 * 问题描述:在不使用 sqrt(x) 函数的情况下,得到 x的平方根的整数部分。
 * 重点考察:二分法、牛顿迭代
 * 原文地址:https://www.codernav.com/2816.html
 * 更多算法详解:https://www.codernav.com
 */
public class OdTest17 {
    public static void main(String[] args) {
        System.out.println(newton(24));
    }

    public static int newton(int x) {
        if (x == 0) return 0;
        return ((int) (sqrts(x, x)));
    }

    public static double sqrts(double i, int x) {
        double res = (i + x / i) / 2;
        if (res == i) {
            return i;
        } else {
            return sqrts(res, x);
        }
    }
}

 

© 版权声明

相关文章

开发者导航新手教程

暂无评论

暂无评论...