1. 程式人生 > >階乘計算升級版

階乘計算升級版

保存 本質 位數 i++ NPU -s www. 假設 階乘

本題要求實現一個打印非負整數階乘的函數。
函數接口定義:

void Print_Factorial ( const int N );

其中N是用戶傳入的參數,其值不超過1000。如果N是非負整數,則該函數必須在一行中打印出N!的值,否則打印“Invalid input”。
裁判測試程序樣例:

include <stdio.h>

void Print_Factorial ( const int N );

int main()
{
int N;

scanf("%d", &N);
Print_Factorial(N);
return 0;

}

/* 你的代碼將被嵌在這裏 */

輸入樣例:

15

輸出樣例:

1307674368000

解題思路:

C 語言提供的數據類型都不足以支持這麽大的數據。該算法模擬了手算過程,用數組來存放最終結果的每位。由於 N 值不超過 1000,利用計算器計算了一下結果最多有 2568 位。所以本算法定義了一個 2568 位的數組來存放最終的結果。不想精確計算或者沒有工具計算的話,可以直接定義一個很大的數組。

算法過程:

以計算 5 的階乘為例,假設現在數組裏已經存放了計算好的 4 的階乘結果 2 4 (fact[1] = 2, fact[0] = 4),接下來要乘以 5。算法過程即為,4 * 5 加上進數 n(初始時 n 為 0),用 temp 保存,這個值就是5!的準確值。temp 取余後,取出5!的個位數字,放在 fact[0] 中(為了方便運算,數據是逆序存儲在數組中的)。temp 再除以 10,得到進數 n,然後處理下一位。下一位操作與當前位的操作是一致的。就這樣一致循環處理下去,直到沒有進位。

本質上是模擬手算的過程。

最後逆序輸出結果數組。

解題代碼:

void Print_Factorial ( const int N) {
int fact[2568] = {0};
fact[0] = 1; //任何數和1相乘不影響它的結果
int n = 0, k = 1; // n 為進的數,k 為當前結果的總位數
for (int i=2; i<=N; i++) { //i從2開始
for (int j=0; j<k; j++) {
int temp = i * fact[j] + n; //最關鍵的步驟,就是本位乘積和來自低位的進位求和
fact[j] = temp % 10;
n = temp / 10;

if (n && j==k-1) {
k++;
} // 當有進位且已經處理到最前位時才開拓目標數組的下一位
}
}
for (int i=k-1; i>=0; i--) { //逆序輸出整個數組。
if (N >= 0) {
printf("%d", fact[i]);
} else {
printf("Invalid input");
}
}
printf("\n");
}

註意:在原鏈接上修改了一下,原鏈接:http://www.cnblogs.com/andywenzhi/p/5722114.html

階乘計算升級版