三、遞推法
遞推法是利用問題本身所具有的一種遞推關係求問題解的一種方法。設要求問題規模為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 樣例輸出 如下...