­

【藍橋杯】BASIC-30 階乘計算

  • 2019 年 11 月 13 日
  • 筆記

版權聲明:本文為部落客原創文章,遵循 CC 4.0 BY-SA 版權協議,轉載請附上原文出處鏈接和本聲明。

本文鏈接:https://blog.csdn.net/weixin_42449444/article/details/102981773

題目描述:

輸入一個正整數n,輸出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!的值。

輸入描述:

輸入包含一個正整數n(n< =1000)。

輸出描述:

輸出n!的準確值。

輸入樣例:

10 

輸出樣例:

3628800

解題思路:

藍橋杯的數據就nm大得離譜,我太難了,一開始我傻比地把maxn設成了1001,一提交就出現WA,只過了27%的測試用例。當輸入為1000時,輸出結果有2567位,然後我把maxn改成了3001。沒必要開太大,不然刪除前置0的時候會多耗時。

AC程式碼:

#include <bits/stdc++.h>  using namespace std;  #define Up(i,a,b) for(int i = a; i <= b; i++)  const int maxn = 10001;    int main()  {      ios::sync_with_stdio(false);      cin.tie(0),cout.tie(0);      int a[maxn] = {1};      int n;      cin >> n;      Up(i,1,n)      {          Up(j,0,maxn-1)          {              a[j] *= i;          }          Up(j,0,maxn-1)          {              if(a[j] >= 9)              {                  a[j+1] += a[j]/10;                  a[j] %= 10;              }          }      }      int i = maxn-1;      while(i>0 && a[i]==0)   //刪除前置0      {          i--;      }      for( ; i >= 0; i--)      {          cout << a[i];      }      return 0;  }