用data陣列來存放階乘的每一位數字,首先令第一位的數值為1,位數為1,然後將每次相乘的乘積存回陣列,並迴圈處理每個陣列中超過10的數,若數值超過10,則需要進製,將位數加1,原來的數除以10,商數加前一位數的數值後存回前一位數的陣列中,再將餘數存回原來位數的陣列中。
例如求5!的值
步驟一:
1!=1
位數1陣列內容0 0 0 1
步驟二:
2!=2*1!=2
位數1陣列內容0 0 0 2
步驟三:
3!=3*2!=3*2=6
位數1陣列內容0 0 0 6
步驟四:
4!=4*3!=4*6=24
位數1陣列內容0 0 0 24
因為24大於10,需要進製
data[1]=data[1]+data[0]/10=0+2=2
data[0]=data[0]%10=4
所以陣列內容為0 0 2 4
位數2步驟五:
5!=5*4!=5*24=120
位數2陣列內容為0 0 2*5 4*5
即0 0 10 20
因為data[0]大於10,需要進製
data[1]=data[1]+data[0]/10=10+2=12
data[0]=data[1]%10=0
此時陣列內容為0 0 12 0
data[2]=data[2]+data[1]/10=0+1=1
data[1]=data[1]%10=2
位數加1
陣列內容為0 1 2 0
一次類推,可以計算大數的階乘,**如下:
#include #include #include #include #define max 100
void factorial(int n,char output)
; result[0] = 1;
for(i = 2; i <= n; i++) }
for(i = max - 1; i >= 0; i--) }
for(j = i; j >= 0; j--) }
int main()
; factorial(20,out);
printf("result:%s\n", out);
return 0;
}
大數階乘演算法
大數階乘演算法 前幾天朋友問我乙個問題 10000的階乘怎麼算?當時我就有點懵,10000 這個數字太大了,無論用什麼資料型別儲存結果都會溢位。這可怎麼辦呢?一時間束手無策。然後被一頓鄙視。後來經朋友的提醒,才恍然大悟,終於知道怎麼實現了,原來是使用陣列來模擬數字,這樣無論結果數字有多大,只要陣列的...
演算法 大數階乘
對於比較小的數n,可以通過遞迴或迴圈將計算結果儲存為整形。但是如果n很大的時候,比如1000,那麼n 肯定超出整形資料所能表示的範圍。因此必須採用其他方法解決。一般是採用陣列模擬。實現 如下 include include include define store step size 100 sta...
轉 大數階乘演算法
大數階乘演算法 大數階乘演算法 前幾天朋友問我乙個問題 10000的階乘怎麼算?當時我就有點懵,10000 這個數字太大了,無論用什麼資料型別儲存結果都會溢位。這可怎麼辦呢?一時間束手無策。然後被一頓鄙視。後來經朋友的提醒,才恍然大悟,終於知道怎麼實現了,原來是使用陣列來模擬數字,這樣無論結果數字有...