题干:

Given an integer N(0 ≤ N ≤ 10000), your task is to calculate N! 

Input

One N in one line, process to the end of file. 

Output

For each N, output N! in one line. 

Sample Input

1
2
3

Sample Output

1
2
6

解题报告:

     大数运算。不知道为什么两者用时差别这么大。

AC代码1:(3042ms, 41000kb)

#include<iostream>
#include<string>
#include<cstring>
#include<cstdio>
int a[10000005]={0,1};
int p=1,c;//p´ú±íµ±Ç°Î»Êý£¬c´ú±í½øλµÄÖµ 
using namespace std;
void big_mul(int a[],int x){
	int i=1;
	c=0;
	for(i=1;i<=p;i++){
		a[i]=a[i]*x+c;
		c=a[i]/10;
		a[i]%=10;
	}
	while(c>0){
		p++;
		a[p]=c%10;
		c/=10;
	}
}
void print(){
	for(int i=p;i>=1;--i) {
		printf("%d",a[i]);
	}
	printf("\n");
}
void init(){
	p=1;
	c=0;
	memset(a,0,sizeof(a));
	a[1]=1;
}
int main()
{
	int n;
	while(scanf("%d",&n)!=EOF){
		init();
		for(int i=1;i<=n;i++){
			big_mul(a,i);
		}
		print();
	}
	
	return 0 ;
}

AC代码2:(967ms, 1828kB)

#include<iostream>
using namespace std;
int a[1000005];
int main()
{
	long long int n,c,p;
	while(scanf("%lld",&n)!=EOF){ 
		p=1;
		a[1]=1;
		for(int i=2;i<=n;i++){
			c=0;
			for(int j=1;j<=p;j++){
				a[j]=a[j]*i+c;
				c=a[j]/10;
				a[j]%=10;
			}
			while(c>0){
				p++;
				a[p]=c%10;
				c/=10;
			}
		} 
		for(int i=p;i>=1;i--){
			printf("%d",a[i]);
		}
		printf("\n"); 
	}
	return 0 ;
 }