用C++實現:高精度階乘


問題描述
  輸入一個正整數 n,輸出 n!的值。
  其中 n!=1*2*3*…* n
算法描述
   n!可能很大,而計算機能表示的整數范圍有限,需要使用高精度計算的方法。使用一個數組 A來表示一個大整數 aA[0]表示 a的個位, A[1]表示 a的十位,依次類推。
  將 a乘以一個整數 k變為將數組 A的每一個元素都乘以 k,請注意處理相應的進位。
  首先將 a設為1,然后乘2,乘3,當乘到 n時,即得到了 n!的值。
輸入格式
  輸入包含一個正整數 nn<=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的有效位開始輸出。

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM