看到这道题的第一反应是直接求阶乘,思考方案的过程中发现不可行,当N的值足够大时,N!将会溢出。
因此考虑,如果N!= K×10M,且K不能被10整除,那么N!末尾有M个0。再考虑对N!进行质因数分解,N!=(2x)×(3y)×(5z)…,由于10 = 2×5,所以M只跟X和Z相关,每一对2和5相乘可以得到一个10,于是M = min(X, Z)。不难看出X大于等于Z,因为能被2整除的数出现的频率比能被5整除的数高得多,所以把公式简化为M = Z。
代码如下:
int GetZeroCount(int x)
{
int count = 0;
int i, j;
for (i = 0; i <= x ; i++)
{
j = i;
while (j % 5 == 0)
{
count++;
j = j / 5;
}
}
return count;
}