zoukankan      html  css  js  c++  java
  • leetcode — sqrtx

    /**
     * Source : https://oj.leetcode.com/problems/sqrtx/
     *
     *
     * Implement int sqrt(int x).
     *
     * Compute and return the square root of x.
     */
    public class Sqrt {
    
        /**
         * 求x的平方根,这里要求的是整数
         * 使用试乘法(可能存在大数乘法,会溢出)、或者试除法
         * 这里使用试乘法,可以通过二分法来快速收敛
         * 使用试除法可以避免大数乘法
         *
         * 试乘法
         *
         * @param x
         * @return
         *
         */
        public int sqrt (int x) {
            if (x == 0) {
                return 0;
            }
            int mid = x / 2 + 1;
            int left = 0;
            int right = mid;
            long temp;
            while (left < right) {
                temp = (long)mid * mid;
                if (temp == x) {
                    return mid;
                }
                if (temp > x) {
                    right = mid - 1;
                } else {
                    left = mid + 1;
                }
                mid = (right + left) / 2;
            }
            temp = right * right;
            if (temp > x) {
                return right - 1;
            } else {
                return right;
            }
        }
    
        /**
         * 试除法
         * @param x
         * @return
         */
        public int sqrt1 (int x) {
            if (x == 0) {
                return x;
            }
            int i = 1;
            for (; i < x; i++) {
                if (i == x / i) {
                    return i;
                } else if (i > x/ i) {
                    return i - 1;
                }
            }
            return i;
        }
    
        /**
         * 使用牛顿法:可计算较精确的根
         * 参见:https://zh.wikipedia.org/wiki/%E7%89%9B%E9%A1%BF%E6%B3%95
         *
         * @param x
         * @return
         */
        public int sqrt2 (int x) {
            if (x == 0) {
                return x;
            }
            double current = 1;
            double last = 0;
            while (current != last) {
                last = current;
                current = (current + x / current) / 2;
            }
            return (int)current;
        }
    
    
        public static void main(String[] args) {
            Sqrt sqrt = new Sqrt();
            System.out.println("=========sqrt============");
            System.out.println(sqrt.sqrt(9));
            System.out.println(sqrt.sqrt(8));
            System.out.println(sqrt.sqrt(0));
            System.out.println(sqrt.sqrt(1));
            System.out.println(sqrt.sqrt(Integer.MAX_VALUE));
    
            System.out.println("=========sqrt1============");
            System.out.println(sqrt.sqrt1(9));
            System.out.println(sqrt.sqrt1(8));
            System.out.println(sqrt.sqrt1(0));
            System.out.println(sqrt.sqrt1(1));
            System.out.println(sqrt.sqrt1(Integer.MAX_VALUE));
    
            System.out.println("=========sqrt2============");
            System.out.println(sqrt.sqrt2(9));
            System.out.println(sqrt.sqrt2(8));
            System.out.println(sqrt.sqrt2(0));
            System.out.println(sqrt.sqrt2(1));
            System.out.println(sqrt.sqrt2(Integer.MAX_VALUE));
        }
    }
    
  • 相关阅读:
    [OrangePi] Installation on SD Card
    网线直连笔记本玩树莓派
    vim多行缩进的方法
    对linux的根目录执行强制递归移除
    windows下快速启动 nginx 和 php-cgi 的两个批处理
    windows下nginx和php环境的配置
    c语言对文件操作完成后尽量手动关闭
    [记录]使用openGL显示点云的一个程序
    linux中使用软链接时出现 too many levels of symbolic links
    使用 nano 的时候提示找不到 libncursesw.so.5 这个共享库
  • 原文地址:https://www.cnblogs.com/sunshine-2015/p/7697694.html
Copyright © 2011-2022 走看看