国产片侵犯亲女视频播放_亚洲精品二区_在线免费国产视频_欧美精品一区二区三区在线_少妇久久久_在线观看av不卡

服務器之家:專注于服務器技術及軟件下載分享
分類導航

PHP教程|ASP.NET教程|JAVA教程|ASP教程|編程技術|正則表達式|C/C++|IOS|C#|Swift|Android|JavaScript|易語言|

服務器之家 - 編程語言 - JAVA教程 - Java版超大整數階乘算法代碼詳解-10,0000級

Java版超大整數階乘算法代碼詳解-10,0000級

2021-03-16 13:13Yangcl JAVA教程

這篇文章主要介紹了Java版超大整數階乘算法代碼詳解-10,0000級,具有一定借鑒價值,需要的朋友可以參考下

當計算超過20以上的階乘時,階乘的結果值往往會很大。一個很小的數字的階乘結果就可能超過目前個人計算機的整數范圍。如果需求很大的階乘,比如1000以上完全無法用簡單的遞歸方式去解決。在網上我看到很多用c、c++和c#寫的一些關于大整數階乘的算法,其中不乏經典但也有很多粗糙的文章。數組越界,一眼就可以看出程序本身無法運行。轉載他人文章的時候,代碼倒是仔細看看啊。唉,粗糙。過年了,在家閑來蛋疼,仔細分析分析,用java實現了一個程序計算超大整數階乘。思想取自網上,由我個人優化和改進。

這個方法采用“數組進位”算法。在超越計算機變量取值范圍的情況下,將多位數相乘轉化為一位數相乘。如11!=39916800,若需求12的階乘,則需要將39916800與12相乘,可利用乘法分配率。乘法豎式如下圖所示:

Java版超大整數階乘算法代碼詳解-10,0000級

使用一個數組來保存階乘每一位的結果,一個數組元素保存一位數。例如:將11的階乘的結果399
16800保存到數組的8個元素中,要計算12的階乘就用每個數組元素中的值去乘以12,并將結果保存到原來的數組元素中。接下來去判斷每個數組元素是否需要進位,通過進位操作使數組中的每個元素保存的數都只有一位數,示意圖如下:

Java版超大整數階乘算法代碼詳解-10,0000級

理論上講,只要計算機內存空間允許就可以保存任意多位的階乘結果,不再受變量的取值范圍的限制,只受到操作系統的尋址能力和計算機內存的限制。友情提示:如果要求的階乘數字很大則可以將數組定義為long類型,以避免在計算單位數的乘積時出現溢出的情況。

實現代碼如下:

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
public class biginteger
{
    /**
     * 計算進位
     * @param bit    數組
     * @param pos 用于判斷是否是數組的最高位
     */
    private void carry(int[] bit, int pos)
        {
        int i ,carray = 0;
        for (i = 0 ; i<= pos ;i++)//從0到pos逐位檢查是否需要進位
        {
            bit[i] += carray;
            //累加進位
            if(bit[i] <= 9)   //小于9不進位
            {
                carray = 0;
            } else if(bit[i] >9 && i<pos)//大于9,但不是最高位
            {
                carray = bit[i]/10;
                //保存進位值
                bit[i] = bit[i]%10;
                //得到該位的一位數
            } else if(bit[i] > 9 && i >= pos)//大于9,且是最高位
            {
                while(bit[i] > 9)//循環向前進位
                {
                    carray = bit[i]/10;
                    //計算進位值
                    bit[i] = bit[i] % 10;
                    //當前的第一位數
                    i ++ ;
                    bit[i] = carray;
                    //在下一位保存進位值
                }
            }
        }
    }
    /**
     * 大整數階乘
     * @param biginteger 所計算的大整數
     */
    private void bigfactorial(int biginteger)
        {
        int pos =0;
        //
        int digit;
        //數據長度
        int a , b ;
        int m = 0 ;
        //統計輸出位數
        int n = 0 ;
        //統計輸出行數
        double sum = 0;
        //階乘位數
        for (a = 1 ; a <= biginteger ; a ++)//計算階乘位數
        {
            sum += math.log10(a);
        }
        digit = (int)sum + 1;
        //數據長度
        int[] fact = new int[digit];
        //初始化一個數組
        fact[0] = 1;
        //設個位為 1
        for (a = 2 ; a <= biginteger ; a++ )//將2^biginteger逐個與原來的積相乘
        {
            for (b = digit-1 ; b >= 0 ; b--)//查找最高位{}
            {
                if( fact[b] != 0 )
                                {
                    pos = b ;
                    //記錄最高位
                    break;
                }
            }
            for (b = 0; b <= pos ; b++)
                        {
                fact[b] *= a ;
                //每一位與i乘
            }
            carry(fact,pos);
        }
        for (b = digit-1 ; b >= 0 ; b --)
                {
            if(fact[b] != 0)
                        {
                pos = b ;
                //記錄最高位
                break;
            }
        }
        system.out.println(biginteger +"階乘結果為:");
        for (a = pos ; a >= 0 ; a --)//輸出計算結果
        {
            system.out.print(fact[a]);
            m++;
            if(m % 5 == 0)
                        {
                system.out.print(" ");
            }
            if(40 == m )
                        {
                system.out.println("");
                m = 0 ;
                n ++;
                if(10 == n )
                                {
                    system.out.print("\n");
                    n = 0;
                }
            }
        }
        system.out.println("\n"+"階乘共有: "+(pos+1)+" 位");
    }
    public void dobigfactorial(int biginteger)
        {
        int timebegin=(int) system.currenttimemillis();
        this.bigfactorial(biginteger);
        int timefinishi=(int) system.currenttimemillis();
        int time = timefinishi-timebegin;
        system.out.println("計算耗時: " + time +"毫秒" );
    }
    public static void main(string[] args)
        {
        biginteger bi = new biginteger();
        bi.dobigfactorial(100000);
    }
}

計算10,0000的階乘,顯示結果如下:

Java版超大整數階乘算法代碼詳解-10,0000級

這樣的結果,控制臺顯然已經無法保存內容了。10萬的階乘有45萬位之多,這就相當于一本有45萬字的小說一樣。對比1000的階乘結果如下:

Java版超大整數階乘算法代碼詳解-10,0000級

控制臺可以完整顯示。

總結

以上就是本文關于java版超大整數階乘算法代碼詳解-10,0000級的全部內容,希望對大家有所幫助。如有不足之處,歡迎留言指出。感謝朋友們對本站的支持!

原文鏈接:http://www.open-open.com/home/space-135360-do-blog-id-9620.html

延伸 · 閱讀

精彩推薦
主站蜘蛛池模板: 男人影音| 日韩成人在线一区二区 | 欧美日本一区二区三区 | 91精品国产综合久久福利软件 | 国产高清自拍视频 | 国产视频一二三区 | 最新国产精品精品视频 | 少妇精品久久久久久久久久 | 日韩高清一区 | 精品无码久久久久国产 | 久久九 | 精品视频一区二区三区 | 国产欧美日韩专区 | av高清在线看 | 国产成人黄色 | 日韩在线观看中文字幕 | 操操操小说 | 久久综合2019 | 欧美日韩午夜 | 精品欧美乱码久久久久久1区2区 | 韩日精品一区 | 国产精品美女 | 久久久国产一区 | 欧美亚洲一区 | 日韩一二三区视频 | 成人免费在线播放 | 国产高清免费 | 91在线免费观看 | 男女全黄一级一级高潮免费看 | 中文字幕高清一区 | 欧美在线99 | 久久久亚洲国产美女国产盗摄 | 久久99精品视频 | 好吊妞国产欧美日韩免费观看视频 | 欧美日韩中文 | japan23xxxxhd乱| 北条麻妃一区二区免费播放 | 亚洲一区二区国产 | 久久久久久久久久久免费视频 | 淫片在线| 国产成年人视频 |