爲了實現任意大數的運算,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 何処へ行くの