#include #include #define MUNITNUM 65535 #define LIMIT_N 15000 #define DIGIT_UNIT 4 #define DTYPE long static char *z[] = { "", "0", "00", "000", }; int main(int argc, char **argv) { int i, j; DTYPE n, N; DTYPE s[MUNITNUM]; DTYPE mufactor, zeros; DTYPE mmax = 0, carry = 0, mmul = 0, mmax_s; if (argc != 2) { fprintf(stderr, "usage: %s N\n", argv[0]); exit(1); } N = atoi(argv[1]); if (N > LIMIT_N) { fprintf(stderr, "error: N too large (max allowed is %d)\n", LIMIT_N); exit(1); } s[0] = 1; mufactor = (int)pow((double)10, (double)DIGIT_UNIT); for (i = 2; i <= N; i++) { mmax_s = mmax; for (j = 0; j <= mmax_s; j++) { n = s[j]; mmul = n * i + carry; carry = mmul / mufactor; mmul %= mufactor; s[j] = mmul; if ((carry != 0) && (j == mmax)) { mmax++; s[mmax] = carry; carry = 0; } } } for (i = mmax; i >= 0; i--,zeros=0) { if (i != mmax) { ((s[i] < 10) && (zeros = 3)) || ((s[i] < 100) && (zeros = 2)) || ((s[i] < 1000) && (zeros = 1)); printf ("%s", z[zeros]); } printf ("%d", s[i]); } printf ("\n"); exit(0); }