【题解-信息学奥赛一本通】1172:求10000以内n的阶乘

题目:1172:求10000以内n的阶乘

题目描述

求10000以内n的阶乘。

输入

只有一行输入,整数n(0≤n≤10000)。

输出

一行,即n!的值。

时空限制

1s / 64MB

样例输入

复制代码
4

样例输出

复制代码
24

思路

普通的数组存储每一位过不去,于是采用压位,数组的每一位存三位数。只要在乘法中%1000、/1000即可。但是注意在输出时,除了最高位,其他位要补前导0。

代码

cpp 复制代码
#include<bits/stdc++.h>
using namespace std;
typedef long long LL;
int n;
vector<LL> A,C;
LL t;
int main() {
    cin>>n;
    A.push_back(1);
    for(int i=2;i<=n;i++){
    	C.clear();
		t=0;
		for(int j=0;j<A.size();j++){
			t+=1LL*A[j]*i;
			C.push_back(t%1000);
			t/=1000;
		}
		while(t){
			C.push_back(t%1000);
			t/=1000;
		}
		A=C;
	}
	cout<<A[A.size()-1];
	//写法1:三个分支
    for(int i=A.size()-2;i>=0;i--){
    	if(A[i]<10)	cout<<"00"<<A[i];
    	else if(A[i]<100) cout<<"0"<<A[i];
    	else cout<<A[i]; 
	} 
	//写法2:格式化输出
	for(int i=A.size()-2;i>=0;i--){
    	printf("%03lld",A[i]);
	} 	
    return 0;
}

结果