20111122

ACM 623 500!

一開始直接做超過3秒 TE。
只好事先算出答案,
結果忘記考慮0! ,
WA一次。

/* ACM 623 500!
 * mythnc
 * 2011/11/22 21:08:08   
 * run time: 0.084
 */
#include <stdio.h>

#define MAXD 2600
#define MAXN 1001

int mul(int *, int);
void copy(int *, char *, int);

int main(void)
{
    int n, i, digit;
    int big[MAXD] = { 1 };
    char fac[MAXN][MAXD];
    /* precalculate */
    for (i = 0; i < MAXN; i++) {
        digit = mul(big, i);
        copy(big, fac[i], digit);
    }

    while (scanf("%d", &n) == 1)
        printf("%d!\n%s", n, fac[n]);

    return 0;
}

/* mul: do b * n return its digit */
int mul(int *b, int n)
{
    int i;

    if (n == 0)
        return 0;

    for (i = 0; i < MAXD; i++)
        b[i] *= n;
    /* carry */
    for (i = 0; i < MAXD - 1; i++)
        if (b[i] > 9) {
            b[i + 1] += b[i] / 10;
            b[i] %= 10;
        }
    /* find digit */
    for (i = MAXD - 1; b[i] == 0 && i > -1; i--)
        ;

    return i;
}

/* copy: copy b to f */
void copy(int *b, char *f, int d)
{
    int i;

    for (i = 0; d > -1; i++, d--)
        f[i] = b[d] + '0';
    f[i++] = '\n';
    f[i] = '\0';
}

沒有留言: