题干:
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 ;}