遞推法求大數階乘

2021-09-07 23:53:03 字數 1208 閱讀 8548

三、遞推法

遞推法是利用問題本身所具有的一種遞推關係求問題解的一種方法。設要求問題規模為n的解,當n=1時,解或為已知,或能非常方便地得到解。能採用遞推法構造演算法的問題有重要的遞推性質,即當得到問題規模為i-1的解後,由問題的遞推性質,能從已求得的規模為1,2,…,i-1的一系列解,構造出問題規模為i的解。這樣,程式可從i=0或i=1出發,重複地,由已知至i-1規模的解,通過遞推,獲得規模為i的解,直至得到規模為n的解。

【問題】階乘計算

問題描述:編寫程式,對給定的n(n≤100),計算並輸出k的階乘k!(k=1,2,…,n)的全部有效數字。

由於要求的整數可能大大超出一般整數的位數,程式用一維陣列儲存長整數,儲存長整數陣列的每個元素只儲存長整數的一位數字。如有m位長整數n用陣列a[ ]儲存(長度為m+1):

n = a[m]

×10(m-1) + a[m-1]

×10(m-2) + 

…+ a[2]

×10(2 -1) + a[1]

×10(1-1)    (#add  最右端有誤,待改)

並用a[0]

儲存長整數

n的位數m,即

a[0] = m。

按上述約定,陣列的每個元素儲存k的階乘k!的一位數字,並從低位到高位依次存於陣列的第二個元素、第三個元素……。例如,5!=120,在陣列中的儲存形式為:

3  0  2  1  …… (#add,顯然 3  1  2  0 更直觀,則上面表示式改一下即可.)

首元素3表示長整數是乙個3位數,接著是低位到高位依次是0、2、1,表示成整數120。

計算階乘

k!可採用對已求得的階乘

(k-1)

!連續累加

k-1次後求得。

例如,已知4!=24,計算5!,可對原來的24累加4次24後得到120。細節見以下程式。

#include

#include

#define

maxn 1000

void

pnext(int

a,intk)

if (carry != 0)

a[++m] = carry; }

free(b);

a[0] = m; }

//輸出k!

void

write (int *a ,intk)

void

main()

}

大數運算 7 大數階乘 求階乘

對於大數來說,乙個數的階乘是非常大的,同樣,乙個int型別的整數,他的階乘就有可能會很大。就拿50來說,他的階乘位數是65位,就已經遠遠超過了long long int型別的最大值。這時候,我們要通過字串的方法,來進行階乘的運算。當然,需要注意的是 我們所求乙個數的階乘,這個數是在int範圍內的,5...

求遞推公式(大數序列)

描述 數列a滿足an an 1 an 2 an 3,n 3 編寫程式,給定a0,a1 和 a2,計算a99 輸入輸入包含多行資料 每行資料報含3個整數a0,a1,a2 0 a0,a1,a2 100000000 資料以eof結束 輸出對於輸入的每一行輸出a99的值 樣例輸入 1 1 1 樣例輸出 如下...

求遞推公式(大數序列)

描述 數列a滿足an an 1 an 2 an 3,n 3 編寫程式,給定a0,a1 和 a2,計算a99 輸入輸入包含多行資料 每行資料報含3個整數a0,a1,a2 0 a0,a1,a2 100000000 資料以eof結束 輸出對於輸入的每一行輸出a99的值 樣例輸入 1 1 1 樣例輸出 如下...