UVA 10023 Square root(高精度开方)

这题啊,没公式还搞不了
这里写图片描述

反馈开方法,实际也是二分搜索的思想

例如要求sqrt(5)
反馈开方法的原理是,令5 = A * B,
5 = A * B的条件下,让A,B不断趋近于中点,直到A = B,这时候 5 = A * B = A * A
那么A就是5的开方

一开始我们取 A = 2
那么 B = 2.5,5 = A*B = 2*2.5
我们发现2和2.5,差距0.5
我们就让A增大一点,增大0.5 / 2 = 0.25,此时A = 2.25
B = 5/2.25 = 2.222,5 = A*B = 2.25 * 2.222
这时候我们发现B 比A小了0.03,这时候我们让A减小一点,那就减小0.015,
此时 A = 2.235 这时候 B = 5/2.235 = 2.237
5 = 2.235 * 2.237
反馈开方法,就是不断调整A,B,直到两个数达到要求的精度,跟二分的思路差不多

import java.math.*;
import java.util.*;

public class Main {
    static BigInteger Sqrt(BigInteger x) {
        BigInteger ret = null, y = x;
        do {
            ret = y;
            y = (ret.add(x.divide(ret))).divide(BigInteger.valueOf(2));
        }while(ret.compareTo(y) > 0);
        return ret;
    }
    public static void main(String []args) {
        Scanner cin = new Scanner(System.in);
        BigInteger x, ans;
        int T;
        T = cin.nextInt();
        while(T-- > 0) {
            x = cin.nextBigInteger();
            ans = Sqrt(x);
            System.out.println(ans);
            if(T > 0) {
                System.out.println();
            }
        }
    }
}

你可能感兴趣的:(uva,10023)