题目:
tip:由于n很大要用到大数模拟才能过,怎么模拟呢,开一个数组每个空间存一定的位数,但是如果只存一位的话会超时,经过多次的WA当每个空间存到7位数时就过了。。要注意的是除了数组末尾前面的数不满7位都要填充0,否则就会丢失掉0,因为是满8位数时进位,每个空间应该是7位数才对。
代码:
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
ll a[15000];
int main()
{
int n;
while(scanf("%d",&n)!=EOF){
memset(a,0,sizeof(a));
a[1]=1; //初始要从1开始乘
int digit=1; //统计当前的位数
for(int i=1;i<=n;i++){ //从1乘到n
for(int j=1;j<=digit;j++) a[j]*=i; //每位数都乘以当前要乘的数
for(int j=1;j<=digit;j++){ //从低位到高位进位处理
if(a[j]>=10000000){ //每个数组存7位,满七位就要进位
for(int k=1;k<=digit;k++){
if(a[digit]>10000000) digit++; //当最后一位超过7位后更新位数
a[k+1]+=a[k]/10000000;a[k]=a[k]%10000000; //模拟进位操作
}
}
}
}
for(int i=digit;i>=1;i--){
if(i!=digit) cout<<setfill('0')<<setw(7)<<a[i]; //若不是数组末尾则其余位填充0,每个空间是7位
else printf("%d",a[i]);
}
printf("\n");
}
return 0;
}