只好事先算出答案,
結果忘記考慮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';
}
沒有留言:
張貼留言