HDOJ 1042 N!
10000!大概有35660位。
开始我把数组只开到27000位,结果老是WA,后来百度了一下10000!的位数才发现自己数学太捉急了。
大概应该这样算,1000到9999共9000 * 3 = 27000个0;100到999共900 * 2 = 1800个0;10!是7位,这样非末尾0相乘共有1000*7=7000位,综上,合计位数大约35000多位,保险起见,数组开到40000;
附ac代码:
#include <stdio.h> #include <string.h> #define MAX 40000 int A[MAX]; int find(){ int i = MAX; while(!A[--i]) ; return i; } int main(){ int n, i, j, k, m; while(scanf("%d", &n) == 1){ if(n < 2){ printf("1\n"); continue; } memset(A, 0, sizeof(A)); A[0] = 1; //A[0]是最低位 for(i = 2; i <= n; ++i){ k = find(); for(j = 0; j <= k; ++j){ A[j] *= i; //在完成一轮乘法后再进位 } //处理进位 for(m = 0; m <= k || A[m] > 9; ++m) if(A[m] > 9) A[m + 1] += A[m] / 10, A[m] %= 10; } k = find(); for(i = k; i >= 0; --i) printf("%d", A[i]); printf("\n"); } return 0; }