手算平方根和基於 Java BigInteger 的大整數平方根的實現

爲了實現任意大數的運算,long用BigInteger替換帶哦。java

好了廢話少數,先說數學原理,也就是手算平方根計算機代碼實現!那麼什麼叫手算平方根了???數組

手開方圖解

聽說前蘇聯的普通工人都會的(毛熊國果真是一個神奇的國度!聽到這裏我背脊發冷,再次膜拜俄羅斯基礎數!!和那使人望而生畏的吉米多維奇了!!! )ide

它的計算步驟以下:code

1.將被開方數的整數部分從個位起向左每隔兩位劃爲一段,用撇號分開分紅幾段,表示所求平方根是幾位數;
2.根據左邊第一段裏的數,求得平方根的最高位上的數;
3.從第一段的數減去最高位上數的平方,在它們的差的右邊寫上第二段數組成第一個餘數
4.把求得的最高位數乘以20去試除第一個餘數,所得的最大整數做爲試商;
5.用商的最高位數的20倍加上這個試商再乘以試商.若是所得的積小於或等於餘數,試商就是平方根的第二位數;若是所得的積大於餘數,就把試商減少再試;
6.用一樣的方法,繼續求平方根的其餘各位上的數.blog

實例的說明

1.如求529的算術平方根時先由個位向左兩位兩位地定位:定位爲5,29,接着象通常除法那樣列出除式.
2.先從最高位用最大平方數試商:最大平方數不超過5的是2,得商後,除式5-4後得1。把商2寫上除式
3.加上下一位的數:得129。
4.用20去乘商後去試商129:2×20=40。由於129/40的整數部分爲3.因此可試商爲3
5.那就把試商的3加上40去除129。得129÷43=3,把3寫上除式上
6.這時129-129=0,無餘數啦。
7.這時除式上的商是23,便是529的平方根。手工是這樣作的。ip

同理計算10517049的平方根也同理數學


Javastring

import java.math.BigInteger;  
public class Test  
{  
    public static String sqrt(String num)  
    {  
        BigInteger b=new BigInteger(num);  
        //不用多解釋了吧  
        if(b.compareTo(BigInteger.ZERO)<0)  
            return "不是非負數";  
      
        String sqrt="0"; //開方結果  
        String pre="0"; //開方過程當中須要計算的被減數  
        BigInteger trynum; //試商,開放過程當中須要計算的減數  
        BigInteger flag;  //試商,獲得知足要求減數的以後一個數  
        BigInteger _20=new BigInteger("20"); //就是20  
        BigInteger dividend; ///開方過程當中須要計算的被減數  
        BigInteger A;  //(10*A+B)^2=M  
        BigInteger B;    
        BigInteger BB;  
          
        int len=num.length(); //數字的長度  
          
        if(len%2==1)  //長度是奇數的畫,首位補上1個0湊成偶數位  
        {  
            num="0"+num;  
            len++;  
        }  
  
        for(int i=0;i<len/2;++i) //獲得的平方根必定是len/2位  
        {  
            dividend=new BigInteger(pre+num.substring(2*i,2*i+2));    
            A=new BigInteger(sqrt);  
            for(int j=0;j<=9;++j)  
            {  
                B=new BigInteger(j+"");  
                BB=new BigInteger((j+1)+"");  
                  
                trynum=_20.multiply(A).multiply(B).add(B.pow(2));  
                flag=_20.multiply(A).multiply(BB).add(BB.pow(2));;  
                      
                //知足要求的j使得試商與計算中的被減數之差爲最小正數  
                if(trynum.subtract(dividend).compareTo(BigInteger.ZERO)<=0  
                        &&flag.subtract(dividend).compareTo(BigInteger.ZERO)>0)  
                {  
                    sqrt+=j;  //結果加上獲得的j  
                    pre=dividend.subtract(trynum).toString(); //更新開方過程當中須要計算的被減數  
                    break;  
                }  
            }         
        }  
        return sqrt.substring(1);  
    }  
      
      
    public static void main(String[] args)  
    {  
        System.out.println(MathTool.sqrt("1234567890123456789"));  
        System.out.println(Math.sqrt(1234567890123456789l));  
    }  
}

運行結果

1111111106
1.1111111061111112E9io

Author by : Kalafianian
本當は空を飛べると知っていたから
羽ばたくときが怖くて風を忘れた
Oblivious 何処へ行くの
相關文章
相關標籤/搜索