<rt id="bn8ez"></rt>
<label id="bn8ez"></label>

  • <span id="bn8ez"></span>

    <label id="bn8ez"><meter id="bn8ez"></meter></label>

    Just Java IT

    西門町學士關于Java的隨便一說而已……

    數組的力量

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

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

    Feedback

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

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

    # re: 數組的力量 2006-04-17 02:07 haha

    你的上面顯示的是不是以10000000為權的值,而不是以10為權的值  回復  更多評論   

    # re: 數組的力量 2006-04-17 19:59 西門町學士

    最終的結果是十進制的。  回復  更多評論   

    主站蜘蛛池模板: 久久久久亚洲?V成人无码| 一级特黄录像免费播放中文版| 免费观看91视频| 国内精品99亚洲免费高清| 一个人免费观看www视频| 久久精品国产亚洲5555| a色毛片免费视频| 亚洲AV无码1区2区久久| 国产精品久久永久免费| 亚洲第一成人在线| 日韩成人免费aa在线看| 西西人体大胆免费视频| 国产亚洲美女精品久久久| 免费h视频在线观看| 亚洲码一区二区三区| 天天摸夜夜摸成人免费视频| 国产精品国产亚洲区艳妇糸列短篇| 国产乱色精品成人免费视频| 一区二区三区精品高清视频免费在线播放 | 久久水蜜桃亚洲av无码精品麻豆 | 免费人成在线观看网站品爱网| 亚洲综合激情六月婷婷在线观看| 一个人免费观看视频www| 日韩亚洲人成在线综合| 国产精品亚洲片在线观看不卡| 毛片免费全部播放无码| 亚洲成a人无码亚洲成www牛牛| 亚洲国产精品碰碰| 99久久久国产精品免费牛牛四川| 学生妹亚洲一区二区| 亚洲视频在线免费| 91九色精品国产免费| 青青草国产免费国产是公开| 亚洲国产精品嫩草影院在线观看 | 野花香高清在线观看视频播放免费| 亚洲视频.com| 日韩精品电影一区亚洲| 午夜视频免费在线观看| 国产综合激情在线亚洲第一页 | 99久久久国产精品免费牛牛四川 | 羞羞网站免费观看|