方法一:自己写的较繁琐的一种方法
#include<iostream>
#include<algorithm>
#include<cstring>
#include<cmath>
using namespace std;
const int maxx=1e5+10;
char s1[maxx],s2[maxx];
int a[maxx],b[maxx];
int c[maxx];
int n;
int main(){while(cin>>n){a[1]=1%10;a[2]=1/10;b[1]=1%10;b[2]=1/10;int m=0;if(n==0){cout<<1<<endl;continue;}for(int i=1;i<=2;i++){for(int j=1;j<=2;j++){c[i+j-1]+=a[i]*b[j];c[i+j]+=c[i+j-1]/10;c[i+j-1]=c[i+j-1]%10;}}int len=n+m;while(c[len]==0&&len>0)len--;memset(a,0,sizeof(a));for(int i=len;i>0;i--){a[i]=c[i];}memset(b,0,sizeof(b));memset(c,0,sizeof(c));for(int i=2;i<=n;i++){m=log10(i)+1;int t=i;int j=0;while(j<m){b[++j]=t%10;t/=10;}for(int k=1;k<=j;k++){for(int z=1;z<=len;z++){c[k+z-1]+=b[k]*a[z];c[k+z]+=c[k+z-1]/10;c[z+k-1]=c[k+z-1]%10;}}len=len+j;while(c[len]==0&&len>0)len--;memset(a,0,sizeof(a));memset(b,0,sizeof(b));for(int k=len;k>0;k--){a[k]=c[k];}memset(c,0,sizeof(c));} for(int i=len;i>0;i--){cout<<a[i];}cout<<endl;}return 0;
}
方法二:网上学习的技巧:
#include<iostream>
#include<algorithm>
#include<cmath>
#include<cstring>
using namespace std;
const int maxx=10005;
const int inf=0x3f3f3f3f;
int a[maxx];
int b[maxx];
int main(){int n;while(cin>>n){memset(a,0,sizeof(a));memset(b,0,sizeof(b));a[1]=1;int len=1;if(n==0){cout<<1<<endl;}else{for(int i=2;i<=n;i++){int v=0;for(int j=1;j<=len;j++){int temp=v+a[j]*i;a[j]=temp%10000;v=temp/10000;}if(v!=0){a[++len]=v;}}cout<<a[len];for(int i=len-1;i>=1;i--){printf("%04d",a[i]); }cout<<endl;}}return 0;
}