階乘的精確值

2021-07-26 06:11:24 字數 1141 閱讀 3742

例如輸入不超過1000的正整數n,輸出n!=1x2x3...xn的精確結果。例如輸入30輸出 265252859812191058636308480000000

當輸入1000時1000的階乘約4*10^(2567),大概3000位數字,如果採用普通的階乘演算法很明顯溢位:

int fun(int n) //求n的階乘的普通演算法
故需要引入高精度演算法。引入乙個大小3000的數字a_int,讓a_int[0]保留個位,讓a_int[1]保留十位,讓a_int[2]保留百位。。。之所以這麼做我們可以按照以下分析:

當n=1時,最終結果1,a_int[0]=1,其他位0即可;

當n=2時,最終結果2,a_int[0]=2,其他位0即可;

當n=3時,最終結果6,a_int[0]=6,其他位0即可;

.當n=4時,最終結果24,a_int[0]=24,此時需要十位和個位拆開,a_int[0]=4,a_int[1]=2,其他位0即可;

.當n=5時,最終結果120,此時a_int[0]=4,a_int[1]=2,其他位0,即120=24*5,4*5=20的個位0放在a_int[0],而其十位需要進製,2*5=10為百位和十位,再加上剛才的進製,得百位十位為12,類似拆開a_int[1]=2,a_int[1]=1其他位0即可;

抽象分析,假設i!=1x2x3...xi結果已經算出並儲存在j個資料單元裡即i!=a_int[j]a_int[j-1]...a_int[2]a_int[1]a_int[0],故輸入i+1時,按照要求:

(i+1)!=1x2x3...xix(i+1),可寫出此時乘法豎式:

對於個位a_int[0],a_int[0]*(i+1)所得數值取其個位保留在a_int[0].剩餘的位作為進製;

對於十位位a_int[1],a_int[1]*(i+1)所得數值再加上個位的進製取其個位保留在a_int[1].剩餘的位作為進製;

對於第k位a_int[k-1],a_int[k-1]*(i+1)所得數值取其個位保留在a_int[k-1].剩餘的位作為進製;

.故演算法如下:

void fun()//階乘的高精度運算

階乘的精確值

輸入乙個不超過1000的正整數n,輸出n 簡單輸入 30簡單輸出 265252859812191058636308480000000 include include define maxn 3000 int f maxn 演算法分析 由於資料不超過1000,則最大為1000,而1000的階乘那是很大...

求n的階乘的精確值

斯特林公式可以求出n!的近似值,但是如果需要求精確值的話,就要採取另外的辦法了。當n 1000的時候,可以直接模擬求階乘,用乙個陣列儲存階乘的每一位,大概3000的陣列就行。程式如下 include include define n 3000 int f n 儲存階乘的位數 int main ret...

演算法入門經典 題目 5 2 2 階乘的精確值

5.2.2 階乘的精確值 輸入乙個不超過1000的數n,計算n!很顯然,1000的階乘會超過int的表示範圍,所以我們要借助陣列來儲存。這裡的具體做法是,先生成乙個陣列,a 0 處放個位數。初始為a 表示1 然後從2 n,每次將乙個數乘到陣列中去。而每次乘乙個數,具體做法是設定乙個進製值c,初始為0...