再找0~9出現次數。
/* ACM 324 Factorial Frequencies * mythnc * 2011/11/18 09:13:32 * run time: 0.012 */ #include <stdio.h> #define MAXD 781 void init(int *, int); int mul(int *, int); void countdec(int *, int, int *); void print(int, int *); int main(void) { int n, count; int seq[MAXD]; int dec[10]; while (scanf("%d", &n) && n != 0) { init(seq, MAXD); init(dec, 10); count = mul(seq, n); countdec(seq, count, dec); print(n, dec); } return 0; } /* init: initialized s to zero */ void init(int *s, int n) { int i; for (i = 0; i < n; i++) s[i] = 0; } /* mul: calculate n!, * return its digit number */ int mul(int *s, int n) { int i, j; for (s[0] = 1, i = 2; i < n + 1; i++) { for (j = 0; j < MAXD; j++) s[j] *= i; /* carry */ for (j = 0; j < MAXD; j++) if (s[j] > 9) { s[j + 1] += s[j] / 10; s[j] %= 10; } } for (i = MAXD - 1; s[i] == 0; i--) ; return i + 1; } /* countdec: count 0~9 times */ void countdec(int *s, int n, int *d) { int i; for (i = 0; i < n; i++) d[s[i]]++; } /* print: print out result */ void print(int n, int *d) { int i; printf("%d! --\n", n); for (i = 0; i < 10; i++) { if (i == 5) printf("\n"); if (i != 0 && i != 5) printf(" "); printf(" (%d)%5d", i, d[i]); } printf("\n"); }
沒有留言:
張貼留言