http://acm.hdu.edu.cn/showproblem.php?pid=1042
N!
Time Limit: 10000/5000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others)
Total Submission(s): 54185 Accepted Submission(s): 15370
Problem Description
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#include<stdio.h> #include<string.h> #define MAX 20000 int main() { char s[100]; int N,a[2*MAX],b[MAX],c[2*MAX],n,m,i,j,k; while(scanf("%d",&N)!=EOF) { if(N==0||N==1)//如果是算0,1的阶乘,则是1 { printf("1\n"); continue; } memset(a,0,sizeof(a)); a[0]=1; for(k=2;k<=N;k++) { memset(b,0,sizeof(b)); sprintf(s,"%d",k); n=strlen(s); for(j=0,i=n-1;i>=0;i--,j++) b[j]=s[i]-'0'; for(i=2*MAX-1;i>0;i--)//a[]是k的阶乘 if(a[i]!=0) break;m=i; memset(c,0,sizeof(c)); for(i=0;i<n;i++) { for(j=0;j<=m;j++) c[j+i]+=a[j]*b[i]; } for(i=0;i<2*MAX;i++) { if(c[i]>=10) { c[i+1]+=c[i]/10; c[i]=c[i]%10; } } for(i=0;i<2*MAX;i++) a[i]=c[i]; } for(i=2*MAX-1;i>0;i--) if(c[i]!=0) break; for(;i>=0;i--) printf("%d",c[i]); printf("\n"); } return 0; }