大數開方

由於Java內置Biginteger,但是卻沒有開方的接口,不得不自己動手寫,在網上學習了,先根據被開方數位數確定開方後數的位數,在自高位枚舉逼近待開方數,最後求得開方結果。

public static BigInteger sqrt(String x) {
        int mlen = x.length();    //被開方數的長度
        int len;    //開方後的長度
        BigInteger beSqrtNum = new BigInteger(x);//被開方數
        BigInteger sqrtOfNum;    //存儲開方後的數
        BigInteger sqrtOfNumMul;    //開方數的平方
        String sString;//存儲sArray轉化後的字符串
        if(mlen%2 == 0)    len = mlen/2;
        else    len = mlen/2+1;
        char[] sArray = new char[len];
        Arrays.fill(sArray, '0');//開方數初始化爲0
        for(int pos=0; pos<len; pos++){
         //從最高開始遍歷數組,每一位都轉化爲開方數平方後剛好不大於被開方數的程度
            for(char num='1'; num<='9'; num++){
                sArray[pos] = num;
                sString = String.valueOf(sArray);
                sqrtOfNum = new BigInteger(sString);
                sqrtOfNumMul = sqrtOfNum.multiply(sqrtOfNum);
                if(sqrtOfNumMul.compareTo(beSqrtNum) == 1){
                    sArray[pos]-=1;
                    break;    
                }    
            }
        }
        return new BigInteger(String.valueOf(sArray));
    }

這個接口需求的是一個String類參數,當然也可以通過簡單的變動變爲Biginteger。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章