<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 西門町學士

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

    主站蜘蛛池模板: 国产成人1024精品免费| 亚洲va在线va天堂成人| 特级毛片aaaa级毛片免费| 毛片在线看免费版| 亚洲午夜精品久久久久久app| 一级毛片成人免费看免费不卡| 久久久综合亚洲色一区二区三区 | 亚洲 欧洲 视频 伦小说| 成年人网站免费视频| 亚洲成a人不卡在线观看| 成年黄网站色大免费全看| 久久精品国产亚洲AV蜜臀色欲| 蜜臀AV免费一区二区三区| 亚洲成综合人影院在院播放| 99久久久精品免费观看国产| 亚洲精品中文字幕无乱码麻豆| 日韩成全视频观看免费观看高清 | 亚洲夜夜欢A∨一区二区三区| 午夜在线免费视频| 永久免费的网站在线观看| 亚洲午夜无码片在线观看影院猛| 国产免费伦精品一区二区三区| 亚洲第一成人影院| 牛牛在线精品观看免费正| 国产中文字幕免费观看| 亚洲人成网站免费播放| 成年女人免费视频播放体验区| 天堂亚洲国产中文在线| 女人18毛片水真多免费看| 中文字幕无码精品亚洲资源网久久 | 免费国产污网站在线观看| 亚洲色精品vr一区二区三区| 永久免费av无码入口国语片| 久久亚洲精品AB无码播放| 57pao一国产成视频永久免费| 亚洲精品在线播放| 浮力影院第一页小视频国产在线观看免费| 亚洲中文字幕无码一去台湾 | 久久亚洲精品成人777大小说| 黄视频在线观看免费| 国产精品美女午夜爽爽爽免费|