大數階乘演算法

2021-06-20 09:32:33 字數 1190 閱讀 2578

大數階乘演算法

前幾天朋友問我乙個問題:「10000的階乘怎麼算?」當時我就有點懵,「10000」這個數字太大了,無論用什麼資料型別儲存結果都會溢位。這可怎麼辦呢?一時間束手無策。然後被一頓鄙視。後來經朋友的提醒,才恍然大悟,終於知道怎麼實現了,原來是使用陣列來模擬數字,這樣無論結果數字有多大,只要陣列的長度夠長就能表示出來,用這個辦法可以進行大資料的運算。看起來還是挺有用的。我把它用程式實現出來,如果有用到的地方還可以借鑑一下。(最起碼還可以拿來鄙視別人^_^)

首先定義乙個足夠長的陣列。

拿10000的階乘為例,最後的結果長度是35660位,所以我們定義乙個40000個成員的陣列就可以了。

int result[40000];

其核心思想就是把計算結果每一位上的數字儲存到乙個陣列成員中,例如:

把124儲存至陣列中,儲存結果應該是

result[0] 4

result[1] 2

result[2] 1

這樣肯定是沒有問題的,乙個int型資料存放乙個小於10的數是絕對不會溢位。但是處理起來就稍微有點麻煩。

把整個陣列看成乙個數字,這個數字和乙個數相乘的時候,需要每一位都和這個乘數進行相乘運算還需要把前一為的進製加上。運算方法和小學數學是一樣的,乘積的個位是當前位上應該表示的數字,10位以上的需要進製。因為乘數不可能大於10000,所以乘數和乙個小於10的書相乘的時候不會大於100000,再加上前一位的進製用乙個int型資料來保持這個結果就沒有問題。寫法如下:

int 結果 = result[x] * 乘數 + 進製;

每一位的計算結果有了,把這個結果的個位數拿出來放到這個陣列元素上:

result[x] = 結果%10;

接下來的工作就是計算出進製:

進製 = 結果 / 10;

這樣一位一位的把整個陣列計算一遍,最後可能還有進製,用同樣的方法,把進製的數值拆成單個數字,放到相應的陣列元素中。

最後輸出一下結果,從最高位吧數字列印一遍就ok了。完整程式如下,在vc6.0下除錯通過。

#include

int main()

while(carry)

}for(int k=digit; k>=1; --k)

printf("%d",a[k-1]);

printf("\n");

printf("length=%d\n",digit);

}return 0;

}

演算法 大數階乘

對於比較小的數n,可以通過遞迴或迴圈將計算結果儲存為整形。但是如果n很大的時候,比如1000,那麼n 肯定超出整形資料所能表示的範圍。因此必須採用其他方法解決。一般是採用陣列模擬。實現 如下 include include include define store step size 100 sta...

大數的階乘演算法

用data陣列來存放階乘的每一位數字,首先令第一位的數值為1,位數為1,然後將每次相乘的乘積存回陣列,並迴圈處理每個陣列中超過10的數,若數值超過10,則需要進製,將位數加1,原來的數除以10,商數加前一位數的數值後存回前一位數的陣列中,再將餘數存回原來位數的陣列中。例如求5!的值 步驟一 1!1 ...

轉 大數階乘演算法

大數階乘演算法 大數階乘演算法 前幾天朋友問我乙個問題 10000的階乘怎麼算?當時我就有點懵,10000 這個數字太大了,無論用什麼資料型別儲存結果都會溢位。這可怎麼辦呢?一時間束手無策。然後被一頓鄙視。後來經朋友的提醒,才恍然大悟,終於知道怎麼實現了,原來是使用陣列來模擬數字,這樣無論結果數字有...