观察一下10以内的数字互相乘,会发现,只有
相乘会产生0,而且 ,...
所以我们只需要看一下 以内 能拆出多少对
然后我们可以发现,有5因子的数比有2因子的数要少,所以我们就看能拆出来多少5就可以了,因为肯定能有足够数量的因子2来匹配。
所以阶乘末尾0的数量就是 中能拆出来的5的数量。但是,从 1 遍历到 n 每个数看一下它能除多少次 5 是不行的。因为 n 的数据范围是1e18。遍历1e18个数复杂度太大了。
那我们来考虑一下,5的倍数可以至少产生1个5,25的倍数可以产生至少2个5,125的倍数可以产生至少3个5...
这样的话 中有n/5个5的倍数,n/25个25的倍数,n/125个125的倍数...
所以答案就是 n/5+n/25+n/25...
c++
class Solution { public: long long thenumberof0(long long n) { long long ans = 0; long long d = 5; while(n>=d) { ans+=n/d; d = d*5; } return ans; } };
java
import java.util.*; public class Solution { public long thenumberof0 (long n) { long ans = 0; long d = 5; while(n>=d) { ans+=n/d; d = d*5; } return ans; } }
python
class Solution: def thenumberof0(self , n ): ans = 0 d = 5 while n>=d: ans+=n//d d = d*5 return ans