對於比較小的數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 這個數字太大了,無論用什麼資料型別儲存結果都會溢位。這可怎麼辦呢?一時間束手無策。然後被一頓鄙視。後來經朋友的提醒,才恍然大悟,終於知道怎麼實現了,原來是使用陣列來模擬數字,這樣無論結果數字有...