问题:spa
Given an integer n, return the number of trailing zeroes in n!.it
Note: Your solution should be in logarithmic time complexity.io
【注】求阶乘的末尾有多少个0,注意时间复杂度要为lognclass
解决:方法
①首先求出n!,而后计算末尾0的个数。(重复÷10,直到余数非0)。该解法在输入的数字稍大时就会致使阶乘得数溢出,不足取。im
②O(logn)解法:只有2和5相乘才会出现0,其中整十也能够看作是2和5相乘的结果,因此,能够在n以前看看有多少个2以及多少个5就好了,又发现2的数量必定多于5的个数,因而咱们只看n前面有多少个5就好了。时间
考虑n!的质数因子。后缀0老是由质因子2和质因子5相乘得来的。若是咱们能够计数2和5的个数,问题就解决了。考虑下面的例子:while
n = 5: 5!的质因子中 (2 * 2 * 2 * 3 * 5)包含一个5和三个2。于是后缀0的个数是1。co
n = 11: 11!的质因子中(2^8 * 3^4 * 5^2 * 7)包含两个5和三个2。因而后缀0的个数就是2。time
咱们很容易观察到质因子中2的个数老是大于等于5的个数。所以只要计数5的个数就能够了。那么怎样计算n!的质因子中全部5的个数呢?一个简单的方法是计算n/5。例如,7!有一个5,10!有两个5。除此以外,还有一件事情要考虑。诸如25,125之类的数字有不止一个5。例如,若是咱们考虑28!,咱们获得一个额外的5,而且0的总数变成了6。处理这个问题也很简单,首先对n÷5,移除全部的单个5,而后÷25,移除额外的5,以此类推。
public class Solution { public int trailingZeroes(int n) { int count = 0; while(n > 0){ n /= 5; count += n; } return count; } }