Just Java IT

          西門町學(xué)士關(guān)于Java的隨便一說而已……

          數(shù)組的力量

          ??? 假如我們要精確計算一個很大的數(shù),比如說,256的階乘(結(jié)果有500多位),怎么辦?
          你會說,很好辦啊,從JDK 1.1起Java不是提供了一個java.math.BigInteger嗎?不錯,用BigInteger確實能解決問題。不過,如果沒有Sun給的這個class,僅僅靠Java最基本的那些類型,我們有沒有辦法來進行計算呢?答案是,肯定是能嘛,要不然在BigInteger之前怎么辦。
          方法之一就是用數(shù)組來表示。比如說:
          ??????????????????????? int[] data = new int[100];
          ??? 我們知道,一個int的最大值為2^31-1即2147483647(10位),如果我們把這100個int值串起來,我們就能表示一個1000位的數(shù)。這里我們就用這種方式來計算256的階乘(256!)。
          ??? 我們先分配100個int的數(shù)組,由于是static,所以每個int的初始值都是0。
          ??? 然后每個int表示6位數(shù),即最大值為999999。因為我們要做乘法,如果給int的位數(shù)過大,如9位,那么999999999乘上一個數(shù),如100,它的值就大于了int的max值,造成溢出。所以int表示的位數(shù)需要根據(jù)需要仔細(xì)選擇。(用long來表示也同樣需要仔細(xì)權(quán)衡位數(shù))
          ??? 再定義一個num來表示我們占用的數(shù)組的int個數(shù)
          ??? 在乘法的時候,對每個占用的int中的數(shù)都要乘,然后一個一個地判斷每個int中的值是不是超出了6位:
          ??????????????????????? if (data[j]) > 1000000)
          ??? 如果超出了則需要進位:
          ??????????????????????? data[k+1] += data[k]/1000000;
          ??????????????????????? data[k] %= 1000000;
          一個個判斷,最后,如果最高位(即data[num])中的數(shù)值也超過了6位,我們就需要占用一個新的int,同樣地進位,當(dāng)然也不要忘了給num加一。
          ??????????????????????? if (data[num] > 1000000) num++;
          ??? 最后,將我們的數(shù)組順序輸出即可。在輸出的時候需要小心的是,如果int中的值小于6位,如25,別忘了補上0,即000025,否則你會得到錯誤的答案的。
          ??? 完整的代碼如下:

          package?tmp;

          /**
          ?*
          ?*?
          @author?Stevech
          ?
          */
          public?class?BigNumbers?{
          ????
          static?int[]?data?=?new?int[100];
          ????
          ????
          /**?Creates?a?new?instance?of?BigNumers?*/
          ????
          public?static?void?main(String[]?args)?{
          ????????
          int?num?=?0;????//?占用的個數(shù)
          ????????data[0]?=?1;????//?0和1的階乘是1
          ????????
          ????????
          for?(int?i?=?2;?i?<?257;?i++)?{
          ????????????
          for?(int?j?=?0;?j?<?num?+?1;?j++)?{
          ????????????????data[j]?
          *=?i;????????//?對每個int中的數(shù)都乘上?i
          ????????????}
          ????????????
          for?(int?j?=?0;?j?<?num?+?1;?j++)?{
          ????????????????
          if?(data[j]?>?1000000)?{
          ????????????????????
          for?(int?k?=?j;?k?<?num?+?1;?k++)?{
          ????????????????????????
          if?(data[num]?>?1000000)?num++;
          ????????????????????????data[k
          +1]?+=?data[k]/1000000;????//?進位
          ????????????????????????data[k]?%=?1000000;??????????????????//?進位后的余數(shù)
          ????????????????????}
          ????????????????}
          ????????????}
          ????????}
          ????????System.out.println(
          "占用的int數(shù):"?+?(num+1)?+?"\n值:");
          ????????System.out.print(data[num]);
          ????????
          for?(int?i?=?num-1;?i?>?-1;?i--)?{
          ????????????System.out.print(
          new?java.text.DecimalFormat("000000").format(data[i]));
          ????????}
          ????}
          }
          輸出結(jié)果為:
          占用的int數(shù):85
          值:
          85781777534284265411908227168123262515778152027948561985965565037726945255314
          75893774402913604514084503758853423365843061571968346936964753222892884974260256
          79637332563368786442675207626794560187968867971521143307702077526646451464709187
          32610083287632570281898077367178145417025052301860849531906813825748107025281755
          94594769870346657127381392862052347568082188607012036110831520935019474371091017
          26968262861606263662435022840944191408424615936000000000000000000000000000000000
          000000000000000000000000000000

          posted on 2006-04-16 21:19 西門町學(xué)士 閱讀(1950) 評論(3)  編輯  收藏 所屬分類: Java

          Feedback

          # re: 數(shù)組的力量 2006-04-16 23:49 黑蝙蝠

          好貼 呵呵 以前一直在尋找類型題型的解法!  回復(fù)  更多評論   

          # re: 數(shù)組的力量 2006-04-17 02:07 haha

          你的上面顯示的是不是以10000000為權(quán)的值,而不是以10為權(quán)的值  回復(fù)  更多評論   

          # re: 數(shù)組的力量 2006-04-17 19:59 西門町學(xué)士

          最終的結(jié)果是十進制的。  回復(fù)  更多評論   

          主站蜘蛛池模板: 宜宾县| 准格尔旗| 宜都市| 汉川市| 扶风县| 静乐县| 体育| 满城县| 石柱| 娱乐| 阿坝| 鹤峰县| 横峰县| 荥阳市| 敦化市| 泌阳县| 肃北| 潮安县| 齐齐哈尔市| 大埔县| 墨江| 平潭县| 江口县| 柘荣县| 九寨沟县| 呼伦贝尔市| 周至县| 翼城县| 江阴市| 怀集县| 丹巴县| 玛沁县| 伊宁市| 秦皇岛市| 湖北省| 呼玛县| 溧水县| 门头沟区| 河北省| 洛浦县| 清远市|