题目
给定一个整数 n, 返回 结果尾数中零的个数。
示例1
输入: 3
输出: 0
解释: 3! = 6, 尾数中没有零。
示例2
输入: 5
输出: 1
解释: 5! = 120, 尾数中有 1 个零.
说明: 算法的时间复杂度应为
方法一(错误的)
求出 的值或者在求的过程中,遇到末尾有0,先除以10来减小数,虽然该算法原理上可以行,但是有两个问题,一、时间复杂度为 ,二、结果不对,出现这个问题的原因是编程语言每种类型有自己的数组范围,因此会溢出。所以该方法实际不可行
方法二
考虑一个问题,位数为零是由2*5产生的,而吧每个数分解,出现5的次数必出现2的次数要少很多,因此,我们通过统计有多少个 5 即可判断尾数有多少个 0.先上代码在将原理
public class LeetCode_172 {
public int trailingZeroes2(int n) {
int count = 0;
while (n > 0) {
count += n / 5;
n /= 5;
}
return count;
}
public static void main(String[] args) {
LeetCode_172 leetCode = new LeetCode_172();
System.out.println(leetCode.trailingZeroes(3));
System.out.println(leetCode.trailingZeroes(5));
System.out.println(leetCode.trailingZeroes(16));
}
}
首先我们先统计n 包含一个5的个数,然后统计包含两个5的个数,依次类推。比如:35!,包含一个5的个数为5,10, 15, 20, 25, 30, 35,即35/5 = 7个,然而当我们遇到25的元素时,里面包含两个5,所以通过 ,更大的数一次类推,当 时即停止,在上面代码中表现为n>0;