/*思考: 该题实际上是求(2 5)因子对的个数。对于任意一个阶乘,5因子的个数总是小于2因子的个数,仅需考虑n!中5因子的个数
方法:
(1) 将该数用 5 除, 得到的商取整数。
(2) 然后再用所得商当被除数除以 5,得到的商取整数。
(3) 持续做到商等于 0 为止。
(4) 过程中的商加总即为阶乘的尾数 0 的个数。
例: 1234! 的尾数 0 的个数计算如下: 代码:
1234/5 = 246
246/5 = 49
49/5 = 9
9/5 = 1
1/5 = 0
------ ---------- 305
原理:
行(1)得到的是1~~~n中因子含5的数的个数
行(2)得到的是1~~~n中因子含25的数的个数
.
.
行(n)得到的是1~~~n中因子含5^n的数的个数
将这些数进行累计就得到了5因子的个数,也就是末尾0的个数。
将N!进行质因数分解,N! = 2^x + 3^y + 5^z + ... ,那么一定有x >= z 因为N! = 1 * 2 * ... * N
在这个乘法序列中,每出现一个5,前面一定有一个2与之对应,况且值为2的幂的数一定多余值为5的幂的数。
这样只要求出z的值即可,因为一个5肯定会在末尾贡献一个,因为任意一个偶数与5相乘都会在末尾产生一个0
所以只要求出在这个序列中有多少数是5的倍数(贡献一个5),有多少数是25的倍数(贡献2个5),有多少125的倍数。。。
所以就有了上面的程序,注意某个数是25的倍数,那么也一定是5的倍数。所以求5的倍数时就计算了其中一个5,求25的倍数时计算了的另外一个5.*/
#include <stdio.h>
int main()
{
int i, n;
scanf("%d", &n);
for(i=0; i<n; i++)
{
int temp;
int cnt = 0;
scanf("%d", &temp);
while(temp != 0)
cnt += (temp = temp/5);
printf("%d\n", cnt);
}
}