http://acm.hdu.edu.cn/showproblem.php?pid=1042
集训第一天比赛上有这个题 以前做过一个求150的 效率比较低 用在这个上面就超时 然后在刘汝佳书上看到一种方法 勉强可以过 3400+ms

1 #include<stdio.h> 2 #include<string.h> 3 int x[40000]; 4 int main() 5 { 6 int i, n,g,s,d; 7 while(scanf("%d", &n)!=EOF) 8 { 9 int max = 40000; 10 memset(x,0,sizeof(x)); 11 x[1] =1; 12 d = 0; 13 for(i = 1 ; i <= n ; i++) 14 { 15 for(g= 1 ; g <max ; g++) 16 { 17 s = x[g]*i+d; 18 x[g] = s%10; 19 d = s/10; 20 } 21 } 22 max--; 23 while(x[max]==0) 24 { 25 max--; 26 } 27 for(i = max ;i >= 1 ; i--) 28 printf("%d", x[i]); 29 puts(""); 30 } 31 return 0; 32 }
在discuss看到一种做法 逢10W进1 234ms 快了不止10倍。。。

1 #include<stdio.h> 2 #include<string.h> 3 int x[10000]; 4 int main() 5 { 6 int i, j, n, m,g,s,d; 7 while(scanf("%d", &n)!=EOF) 8 { 9 int max = 1; 10 memset(x,0,sizeof(x)); 11 x[1] =1; 12 for(i = 1 ; i <= n ; i++) 13 { 14 for(g= 1 ; g <=max ; g++) 15 x[g] = x[g]*i; 16 for(g=1 ; g <=max ; g++) 17 { 18 d = x[g]/100000; 19 x[g] = x[g]%100000; 20 x[g+1] += d; 21 } 22 if(d>0) 23 max++; 24 } 25 printf("%d", x[max]); 26 for(i = max-1 ;i >= 1 ; i--) 27 printf("%05d", x[i]); 28 puts(""); 29 } 30 return 0; 31 }