时间限制:
3000 ms | 内存限制:
65535 KB
难度:
3
-
描述
- 我们都知道如何计算一个数的阶乘,可是,如果这个数很大呢,我们该如何去计算它并输出它?
-
输入
- 输入一个整数m(0<m<=5000) 输出
- 输出m的阶乘,并在输出结束之后输入一个换行符 样例输入
-
50
样例输出
-
30414093201713378043612608166064768844377641568960512000000000000
-
思路:用一个整型数组来装,我们知道,10000的阶乘最后的结果长度是35660,所以我们可以定义一个稍微比它他的数组来存储(注意,这一点很重要,下面以我的
代码注释作一点强调)。AC代码:
//举个例子,11!=39916800,所以12!=11!*12,也就是39916800的每位都乘12,再进位,
//从低到高,所以数组要用a[0]表示低位,输出时再逆序输出
#include<iostream>
#include<string.h>
#include<algorithm>
#define N 40000 //如果不知道例如10000!结果肯定也是错误的
using namespace std;
int a[40000];
int main(){
int n,i,j,s;
cin>>n;
memset(a,0,sizeof(a));
a[0]=1;
for(i=1;i<=n;i++){
int ans=0; //代表进位
for(j=0;j<N;j++){
s=a[j]*i+ans;
a[j]=s%10;
ans=s/10;
}
}
for(i=N-1;i>=0;i--){
if(a[i]!=0)
break;
}
for(j=i;j>=0;j--){
cout<<a[j];
}
cout<<endl;
return 0;
}