熱點推薦:
您现在的位置: 電腦知識網 >> 編程 >> Java編程 >> Java核心技術 >> 正文

Java BigInteger開方sqrt的實現

2013-11-23 19:36:08  來源: Java核心技術 

  本來是為我上學期寫好的MathTool工具類轉化也就是原來這個工具類的方法參數類型是long為了實現任意大數的運算long用BigInteger替換帶哦

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

  手開方

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

  它的計算步驟如下

  .將被開方數的整數部分從個位起向左每隔兩位劃為一段用撇號分開(豎式中的)分成幾段表示所求平方根是幾位數

  .根據左邊第一段裡的數求得平方根的最高位上的數(豎式中的)

  .從第一段的數減去最高位上數的平方在它們的差的右邊寫上第二段數組成第一個余數(豎式中的)

  .把求得的最高位數乘以去試除第一個余數所得的最大整數作為試商(×所得的最大整數是 即試商是)

  .用商的最高位數的倍加上這個試商再乘以試商.如果所得的積小於或等於余數試商就是平方根的第二位數如果所得的積大於余數就把試商減小再試(豎式中(×說明試商就是平方根的第二位數)

  .用同樣的方法繼續求平方根的其他各位上的數.

  一個實例

  ()如求的算術平方根時先由個位向左兩位兩位地定位定位為接著象一般除法那樣列出除式

  ()先從最高位用最大平方數試商最大平方數不超過的是得商後除式後得把商寫上除式

  ()加上下一位的數

  ()用去乘商後去試商×=可試商為那就把試商的加上去除÷=寫上除式上這時=

  ()加上下一位的數

  ()用去乘商後去試商×=可試商為那就把試商的加到去除寫上除式上這時=無余數啦

  ()這時除式上的商是即是的平方根手工是這樣做的寫得羅嗦了但望能看懂

  package comswumath;

  import javamathBigInteger;

  public class Test

  {

  public static String sqrt(String num)

  {

  BigInteger b=new BigInteger(num);

  //不用多解釋了吧

  if(pareTo(BigIntegerZERO)<)

  return 不是正數;

  String sqrt=; //開方結果

  String pre=; //開方過程中需要計算的被減數

  BigInteger trynum; //試商開放過程中需要計算的減數

  BigInteger flag;  //試商得到滿足要求減數的之後一個數

  BigInteger twenty=new BigInteger(); //就是

  BigInteger dividend; ///開方過程中需要計算的被減數

  int len=numlength(); //數字的長度

  if(len%==) //長度為偶數

  {

  for(int i=;i<len/;++i) //得到的平方根一定是len/

  {

  dividend=new BigInteger(pre+numsubstring(*i*i+));

  for(int j=;j<=;++j)

  {

  trynum=twentymultiply(new BigInteger(sqrt))multiply(new BigInteger(j+))add(new BigInteger(j+)multiply(new BigInteger(j+)));

  flag=twentymultiply(new BigInteger(sqrt))multiply(new BigInteger((j+)+))add(new BigInteger((j+)+)multiply(new BigInteger((j+)+)));;

  //滿足要求的j使得試商與計算中的被減數之差為最小正數

  if(trynumsubtract(pareTo(BigIntegerZERO)<=

  &&flagsubtract(pareTo(BigIntegerZERO)>)

  {

  sqrt+=j;  //結果加上得到的j

  pre=dividendsubtract(trynum)toString(); //更新開方過程中需要計算的被減數

  break;

  }

  }

  }

  }

  else //長度為奇數

  {

  for(int i=;i<len/+;++i) //得到的平方根一定是len/+

  {

  if(i==) //奇數位被開方數首位特殊處理

  dividend=new BigInteger(numcharAt()+);

  else

  dividend=new BigInteger(pre+numsubstring(*i*i+));

  for(int j=;j<=;++j)

  {

  trynum=twentymultiply(new BigInteger(sqrt))multiply(new BigInteger(j+))add(new BigInteger(j+)multiply(new BigInteger(j+)));

  flag=twentymultiply(new BigInteger(sqrt))multiply(new BigInteger((j+)+))add(new BigInteger((j+)+)multiply(new BigInteger((j+)+)));;

  //滿足要求的j使得試商與計算中的被減數之差為最小正數

  if(trynumsubtract(pareTo(BigIntegerZERO)<=

  &&flagsubtract(pareTo(BigIntegerZERO)>)

  {

  sqrt+=j; //結果加上得到的j

  pre=dividendsubtract(trynum)toString(); //更新開方過程中需要計算的被減數

  break;

  }

  }

  }

  }

  return sqrtsubstring();

  }

  public static void main(String[] args)

  {

  Systemoutprintln(MathToolsqrt());

  Systemoutprintln(Mathsqrt(l));

  }

  }


From:http://tw.wingwit.com/Article/program/Java/hx/201311/27153.html
  • 上一篇文章:

  • 下一篇文章:
  • 推薦文章
    Copyright © 2005-2013 電腦知識網 Computer Knowledge   All rights reserved.