演算法 大數階乘

2021-10-09 21:35:47 字數 1153 閱讀 6613

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

#include

#include

#include

#define store_step_size 100

static

int s_store_size =0;

#define extent_store(s)

#define destroy_store(s)

/* * digit:

* 9x + x/10 <= int_max

* x = 10int_max/91

*/static

void

fact

(int digit)

/* 1! */

if(digit ==1)

extent_store

(store);if

(store ==

null

) store[0]

=1; size =1;

for(i=

2; i<=digit; i++

)while

(cvalue >0)

} store[

++size -1]

= cvalue %10;

cvalue /=10

;}}for

(i=size-

1; i>=

0; i--

)printf

("%d"

, store[i]);

printf

("\n");

/* store's size and current size */

//printf("s_store_size=%d, size=%d\n", s_store_size, size);

destroy_store

(store);}

intmain

(int argc,

char

**ar**)

fact

(atoi

(ar**[1]

));return0;

}

大數階乘演算法

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

大數的階乘演算法

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

轉 大數階乘演算法

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