题目描述:
Given an integer n, return the number of trailing zeroes in n!.
Note: Your solution should be in logarithmic time complexity.
题目很清楚,就是给定N,求N!的末尾有多少0。对n!做质因数分解n!=2x*3y*5z*...
显然0的个数等于min(x,z),并且min(x,z)==z
又z均由1-N中5的倍数所提供,如果该数仅为5的倍数则贡献1,若为25的倍数则贡献2.
而1-N中,5的倍数个数为|_N/5_|,|_ _|表示取下整数。
又1-N中,25的倍数个数为|_N/25_|.需要注意到的是|_N/5_|已经包含了|_N/25_|。又25的倍数贡献了2,所以考虑到避免重复计算,则N!的素数分解中5的指数z为:
z = |_N/5_|+|_N/25_|+|_N/5^3_|+...
代码如下:
public class Solution { public int trailingZeroes(int n) { if(n<1) return 0; int c = 0; while(n/5 != 0) { n /= 5; c += n; } return c; } }