問題描述
輸入一個正整數
n,輸出
n!的值。
其中 n!=1*2*3*…* n。
其中 n!=1*2*3*…* n。
算法描述
n!可能很大,而計算機能表示的整數范圍有限,需要使用高精度計算的方法。使用一個數組
A來表示一個大整數
a,
A[0]表示
a的個位,
A[1]表示
a的十位,依次類推。
將 a乘以一個整數 k變為將數組 A的每一個元素都乘以 k,請注意處理相應的進位。
首先將 a設為1,然后乘2,乘3,當乘到 n時,即得到了 n!的值。
將 a乘以一個整數 k變為將數組 A的每一個元素都乘以 k,請注意處理相應的進位。
首先將 a設為1,然后乘2,乘3,當乘到 n時,即得到了 n!的值。
輸入格式
輸入包含一個正整數
n,
n<=1000。
輸出格式
輸出
n!的准確值。
樣例輸入
10
樣例輸出
3628800
思路:明顯這個題不能用一般的int之類直接進行乘法運算,要通過數組來模擬階乘以及各位進位的過程。可以從數組第一位算起,依次向右進位,最后輸出的時候倒着輸出即可。
1 #include<iostream> 2 using namespace std; 3 int main(void) 4 { 5 int n, j, temp; //j表示有多少位數字,temp用來算本位數字大小 6 int mod = 0; //余數(進位) 7 cin >> n; 8 int* arr = new int[10000]{ 1,1 }; //至少需要10000位數字 9 for (int i = 1; i <= n; i++) 10 { 11 for (j = 1; j < 10000; j++) 12 { 13 temp = arr[j] * i + mod; //算出本位大小 14 mod = temp / 10; //算出進位大小 15 arr[j] = temp % 10; //算出本位上實際數字 16 } 17 } 18 for (j = 9999; j > 0; j--) //把數組中多余的0去掉 19 { 20 if (arr[j] != 0) 21 { 22 break; 23 } 24 } 25 while (j) //倒着輸出,直到最后一項 26 { 27 cout << arr[j]; 28 j--; 29 } 30 return 0; 31 }
注意:由於定義數組的時候,數組默認了后面所有位都是0,所以再最后輸出之前,還要將沒有參與階乘計算的無效位0刪掉,從第一個不是0的有效位開始輸出。