[命题人:外部介绍 ]
时间限制:1.000 sec 内存限制: 32 MB
解决: 268 提交: 547
译文描述
输入一个正整数N,输出N的阶乘。
输入
正整数N(0 <= N <= 1000)
输出
输入可能包括多组数据,对于每一组输入数据,输出N的阶乘
样例输入 复制
0
4
7
样例输出 复制
1
24
5040
计算阶乘,阶乘到某个数的时候就会超出int型范围甚至longlong型的范围,1000!就远超longlong型的范围,所以一般的求阶乘的方法不再适用。用大整数运算,把每一次计算的中间结果值的各个位存到数组里面, 模拟乘法运算。
#include<cstdio>
#include<cstring>
#include<iostream>
#include<algorithm>
using namespace std;
const int maxn=10010;
const int N=10;
struct bign{
int d[maxn],len;
bign(){
memset(d,0,sizeof(d)); len=0;
}
};
//long long fact[maxn];
int n;
bign mutil(bign a,int b){
bign c;
int carry=0;
for(int i=0;i<a.len;i++){
int temp=a.d[i]*b+carry;
c.d[c.len++]=temp%10;
carry=temp/10;
}
while(carry){
c.d[c.len++]=carry%10;
carry/=10;
}
return c;
}
int main(){
// fact[0]=1;
// for(int i=1;i<=1000;i++){
// fact[i]=fact[i-1]*i;
// }
while(scanf("%d",&n)!=EOF){
if(!n) {
puts("1");
continue;
}
bign a;
a.len=1,a.d[0]=1;
for(int i=2;i<=n;i++){
a=mutil(a,i);
}
for(int i=a.len-1;i>=0;i--)
printf("%d",a.d[i]);
puts("");
}
return 0;
}