每次補0就要移到下一位,
下一位的數字又是取決於乘法進位。
所以直接只用最後幾個位數做乘法是不行的,
因為只要有0就要考慮下一個數。
15!就已經有2個0了。
所以採取的作法是半大數,只計算最後100位數,
至於為什麼是100位數呢?
我只是取一個不會被乘法進位問題干涉到的值,
或許50位數應該也ok吧?可以試試,
或是有其他比較好的作法。
/* ACM 568 Just the Facts
* mythnc
* 2011/11/16 10:06:34
* run time: 0.016
*/
#include <stdio.h>
#define MAXN 10001
#define MAXD 100
void init(int *, char *);
int main(void)
{
int n;
int digit[MAXD] = { 0 };
char save[MAXN];
init(digit, save);
while (scanf("%d", &n) == 1)
printf("%5d -> %c\n", n, save[n]);
return 0;
}
/* init: precalculate answer,
* save last non-zero in array save */
void init(int *d, char *s)
{
int i, j, k;
s[0] = '0';
d[0] = 1;
for (i = 1; i < MAXN; i++) {
for (j = 0; j < MAXD; j++)
d[j] *= i;
/* carry */
for (j = 0; j < MAXD - 1; j++)
if (d[j] > 9) {
d[j + 1] += d[j] / 10;
d[j] %= 10;
}
/* remove zero */
if (i > 4) {
for (j = 0; d[j] == 0; j++)
;
for (k = 0; j < MAXD; j++, k++)
d[k] = d[j];
for (; k < MAXD; k++)
d[k] = 0;
}
/* copy last digit to s */
s[i] = d[0] + '0';
}
}
沒有留言:
張貼留言