大數階乘演算法思想,具體實現網上很多,也順便找了個演算法思想

來源:互聯網
上載者:User

 首先,定義兩個整型的數組:
int fac[1000];//暫且先設定是1000位,我稱之為“結果數組”

int add[1000];//我稱之為“進位元組”

現在具體說明兩個數組的作用:

1.fac[1000]

比如說,一個數5的階乘是120,那麼我就用這個數組儲存它:
fac[0]=0
fac[1]=2
fac[2]=1

現在明白了數組fac的作用了吧。用這樣的數組我們可以放階乘後結果是1000位的數。

2.在介紹add[1000]之前,我介紹一下演算法的思想,就以6!為例:
 從上面我們知道了5!是怎樣儲存的。

 就在5!的基礎上來計算6!,示範如下:

fac[0]=fac[0]*6=0
fac[1]=fac[1]*6=12

fac[2]=fac[2]*6=6

3.現在就用到了我們的:“進位元組”add[1000].

 先得說明一下:add就是在第2步中用算出的結果中,第i位向第i+1位的進位元值。還是接上例:
add[0]=0;

add[1]=1;  // 計算過程:就是 (fac[1]+add[0])  %  10=1

add[2]=0;  // 計算過程:就是 (fac[2]+add[1]) % 10=0
.......
.......

.......

add[i+1] =( fac[i+1] + add ) % 10

現在就知道了我們的數組add[]是幹什麼的了吧,並且明白了add是如何求得的了吧。

4.知道了add[1000]的值,現在就在 1. 和 3 . 兩步的基礎上來計算最終的結果。(第2步僅作為我們理解的步驟,我們下面的計算已經包含了它)

fac[0] = ( fac[0]*6 )  mod 10 =0 

fac[1] = ( fac[1]*6 + add[0] ) mod 10 =2

fac[2] = ( fac[2]*6 + add[1] ) mod 10=7

到這裡我們已經計算完了6!。然後就可以將數組fac[1000]中的數,以字元的形式按位輸出到螢幕上了。

5.還有一點需要說明,就是我們需要一個變數來記錄fac[1000]中實際用到了幾位,比如5!用了前3位;
我們在這裡定義為 top 

      為了計算top,我們有用到了add[1000],還是以上面的為例:
    

    5!時,top=3,在此基礎上我們來看6!時top=?
      由於  add[2]=0

      所以  top=3(沒有變)
也就是說,如果最高位有進位時,我們的top=top+1,否則,top值不變。

6.總結一下,可以發現,我們把階乘轉化為 兩個10以內的數的乘法,還有兩個10以內的數的家法了。

  因此,不管再大的數,基本上都能算出了,只要你的數組夠大就行了。

 

from:http://www.chinaunix.net/jh/23/312721.html


相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.