# Large Number# Arithmetic# Array

c120 - 00623 - 500!

🔗 前往 ZeroJudge 原題

題目描述

題目要求計算並輸出 n 的階乘,其中 n 的範圍是 0 到 1000。由於 500! 的長度超過了標準整數資料型態的表示範圍,因此需要使用字元陣列來模擬大數的乘法運算。

解題思路

程式使用一個整數陣列 b 來儲存階乘的每一位數字。陣列的每個元素代表一個數字,從 b[1]b[10000]。程式首先初始化 b[1] 為 1。然後,對於每個從 1 到 n 的數字 k,程式將 b 陣列中的每個元素乘以 k。由於乘法可能會產生進位,程式會處理進位,將進位加到下一位。在計算完 k 的階乘後,程式將結果轉換為字串 ans[k] 並儲存。最後,程式讀取輸入的 n,輸出 n! 的結果。

複雜度分析

  • 時間複雜度: O(n * m^2),其中 n 是輸入的數字,m 是陣列 b 的大小 (10001)。外層迴圈迭代 n 次,內層迴圈迭代 m 次進行乘法和處理進位。
  • 空間複雜度: O(n + m),其中 n 是儲存結果的字串陣列 ans 的大小,m 是儲存中間計算結果的陣列 b 的大小。

程式碼

#include<iostream>
using namespace std;
int b[10001],k,i,j,start=0;
string ans[1002]={"1\n"};
int main(){
	cin.tie(0); ios::sync_with_stdio(false);
	b[1]=1;
	for(k=1;k<=1000;k++){
		for(j=1;j<=10000;j++)
			b[j]*=k;
		for(j=1;j<=9999;j++){
			if(b[j]>=10){
				b[j+1]+=b[j]/10;
				b[j]%=10;
			}
		}
		for(i=9999;i>=1;i--){
			if(b[i]!=0){
				start=i;
				break;
			}
		}
		for(i=start;i>=1;i--)
			ans[k]+=b[i]+48;
		ans[k]+='\n';
	}
	while(cin >> k){
		cout << k << "!\n";
		cout << ans[k];
	}
}

Discussion