题:https://leetcode.com/problems/factorial-trailing-zeroes/
题目
Given an integer n, return the number of trailing zeroes in n!.
Example 1:
Input: 3
Output: 0
Explanation: 3! = 6, no trailing zero.
Example 2:
Input: 5
Output: 1
Explanation: 5! = 120, one trailing zero.
Note: Your solution should be in logarithmic time complexity.
题目大意
尾部的 0 由 2 * 5 得来,2 的数量明显多于 5 的数量,因此只要统计有多少个 5 即可。
对于一个数 N,它所包含 5 的个数为:N/5 + N/52 + N/53 + …,其中 N/5 表示不大于 N 的数中 5 的倍数贡献一个 5,N/52 表示不大于 N 的数中 52 的倍数再贡献一个 5 …。
如果统计的是 N! 的二进制表示中最低位 1 的位置,只要统计有多少个 2 即可,该题目出自 编程之美:2.2 。和求解有多少个 5 一样,2 的个数为 N/2 + N/22 + N/23 + …
思路
方法一
递归
递归函数:n中有5的个数。
递归转移方程:n/5(从 1~n 中 是5倍数数的个数)+ n/5中有5的个数
终止条件:n==0 ,return 0;
class Solution {
public int trailingZeroes(int n) {
if(n==0)
return 0;
return n/5 + trailingZeroes(n/5);
}
}
方法二
非递归
class Solution {
public int trailingZeroes(int n) {
int res = 0;
while(n>0){
res += n/5;
n = n/5;
}
return res;
}
}