描述
设计一个算法,计算出n阶乘中尾部零的个数
您在真实的面试中是否遇到过这个题?
样例
样例 1:
输入: 11
输出: 2
样例解释:
11! = 39916800, 结尾的0有2个。
样例 2:
输入: 5
输出: 1
样例解释:
5! = 120, 结尾的0有1个。
挑战
O(logN)的时间复杂度
解释:
能产生0的肯定是5和双数相乘,或者10、20等10的倍数,所以以5为单位依次比较发现规律
规律
// 5 1
// 10 2(10/5)
// 15 3(15/5)
// 20 4(20/5)
// 25 5(25/5) + 1 (5/5)
// 105 = 21(105/5) + 4(21/5)
// 150 = 30(150/5) + 6(30/5) + 1(6/5)
// 500000030 = 100 000 006 + 20 000 001 + 4 000 000 + 800 000 + 160 000 + 32000 + 6400 + 1280 + 256 + 51 + 10 + 2
根据规律可得代码:
public long trailingZeros(long n) {
long nums = n / 5;
long sums = nums;
while(nums/5 > 0) {
sums += nums/5;
nums = nums/5;
}
return sums;
}