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