一、朴素做法:
朴素做法就是求出n!。然后每次对10去摸, 再除以10。
就比如5
5! = 120;
fac = 5!
ans = 0;
while(1)
{
if(fac%10 == 0)ans++;
else break;
fac/=10;
}
这种做法的弊端是, n不能太大, n太大 n的阶乘无法储存。
二、
想一下n!阶乘末尾的0取决于什么?
对于每个结尾的 0 都是10 导致的, 对10进行质因子分解2*5。
这里先举个栗子。
比如5的阶乘 == 120。
就可以看成12 *10 —— 12*5*2
所以只要统计 (1~n)中因子2和因子5的个数。
然后再取小, 就是 n的阶乘末尾0的个数。
因为(1~n)内因子2个数肯定大于 因子5个数。
所以问题就转换为(1~n)内因子5的个数。
如何求(1~n)因子5的个数。
要知道因子5一定来自与它的倍数。
所以首先要知道n内5的倍数有多少个,
n内5的倍数数量 == n/5, 这里是整除。
就比如n == 30:
1、 2、 3、 4、