题目: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); } } }
© 版权声明
文章版权归作者所有,未经允许请勿转载。
相关文章
暂无评论...