問你N階乘的最低非零位上是什么數字。(0 <= N <= 4220)
從1一直乘到N,如果能整除10,就除以10,可以嗎?不行,因為即使去掉低位的0,高位的非0位仍然很大,無法保存下來。
可以將N!這樣表示:
N! = 2^K * 5^L * V(N)
= 2^(K-L) * V(N) * 10^L ( K >= L 如何證明呢?)
10^L不影響N!最低非零位,這個數由(K-L)以及V(N)的個位數所決定。K和L容易得到,V(N)的個位數也好得到,只要枚舉i(從1到N),去除因子2和5(因子個數加到K和L),將其個位數乘以中間結果就可以了。
關鍵代碼如下:
const int f2 [] = {6, 2, 4, 8};
int i, tmp, n2, n5;
int ans = 1;
n2 = n5 = 0;
for ( i = 1; i <= n; i ++)
{
tmp = i;
while ( tmp % 2 == 0 )
{
n2 ++;
tmp /= 2;
}
while ( tmp % 5 == 0 )
{
n5 ++;
tmp /= 5;
}
ans = (( tmp % 10) * ans) % 10;
}
ans = ( ans * f2[( n2- n5)%4] ) % 10;
printf( "%d\n", ans);