天天看點

Java求數的平方根,不使用Math.sqrt

題目,給一個整數,求它的平方根,不能使用java自帶的Math.sqrt();

平方根就是開平方,比如4的平方根是2,100的平方根是10;

思路:

我這個方法沒啥特點,就是從1開始瘋狂試探,直到有一個數 i 滿足i * i<=x&&((i+1)*(i+1)>x),這個 i 就是x的平方根;

優化

基于上面的算法,大體思路不會變,我們在 j * j 不等于入參的時候,對結果進行二分後再傳回,無限二分,直到不能再細分,這樣的值會更接近真實平方根;

public class MySqrtDemo {
    public static void main(String[] args) {
        System.out.println(sqrt(10));// 3.1622772216796875
        System.out.println(Math.sqrt(10));// 3.1622776601683795
    }

    public static double sqrt(int i) {
        if (i <= 0) return i;
        double result;
        //從1開始瘋狂試探
        for (int j = 1; true; j++) {
            if (j * j == i) {
                result = j;
                //記得跳出循環
                break;
            } else if ((j * j < i) && ((j + 1) * (j + 1) > i)) {
                result = half(i, j, j + 1);
                //記得跳出循環
                break;
            }
        }
        return result;
    }

    public static double half(int i, double small, double big) {
        double average = (small + big) / 2;
        double result = average * average;
        if (result == i) {
            //如果平均值*平均值等于入參,直接傳回
            return average;
        } else if (result > i) {
            //大于,則在前一個數和平均值之間遞歸二分
            if (String.valueOf(average).length() >= 18) return average;
            return half(i, small, average);
        } else {
            //小于,則在平均值後一個數之間遞歸二分
            if (String.valueOf(average).length() >= 18) return average;
            return half(i, average, big);
        }
    }
}