大數階乘時間限制:3000 ms | 內存限制:65535 KB
難度:3
- 描述
- 我們都知道如何計算一個數的階乘,可是,如果這個數很大呢,我們該如何去計算它並輸出它?
- 輸入
- 輸入一個整數m(0<m<=5000)
- 輸出
- 輸出m的階乘,並在輸出結束之後輸入一個換行符
- 樣例輸入
50
- 樣例輸出
-
30414093201713378043612608166064768844377641568960512000000000000
解題思路:
1.大數問題,關鍵是處理好進位和當前最低位的關係。需要設一個變量(初始值 爲0)來保存進位值。
2.每次相乘得到的結果加進位變量,等於臨時值,通過臨時值%得當前最低位,臨時值/10得進位值。
3.這樣乘得的結果是倒序的,因此需要倒序輸出,還應注意前導0的問題,從數組最後開始,跳過前導0,直到第一個不爲0的數字開始輸出。
代碼:
#include <stdio.h> #include <string.h> #define MAX 16325 int main() { int result[MAX] = {0}; int n; scanf("%d",&n); result[0] = 1;//數組裏此時存的是大數0000....1 for(int i=2; i<=n; i++)//計算n! { int k = 0;//k爲進位數 for(int j=0; j<MAX; j++)//result[j]存當前位的數 { int sum = k + result[j] * i;//得到i!當下次i++時就得到i++的階乘 result[j] = sum % 10;//得到當前最低位 k = sum / 10;//保存進位數 } } int l; for(l=MAX-1; result[l] == 0; l--)//除去前導0 ; for(int j=l; j>=0; j--) printf("%d",result[j]); printf("\n"); return 0; }