LeetCode--172. Factorial Trailing Zeroes

来源:互联网 发布:windows缩小图片大小 编辑:程序博客网 时间:2024/05/19 14:37

Problem:

Given an integer n, return the number of trailing zeroes in n!.

Note: Your solution should be in logarithmic time complexity.

Analysis:

  • 对n!做质因数分解n!=2x*3y*5z*… 显然0的个数等于min(x,z),并且min(x,z)==z

证明:

对于阶乘而言,也就是1*2*3*…*n [n/k]代表1~n中能被k整除的个数 那么很显然 [n/2] > [n/5]
(左边是逢2增1,右边是逢5增1) [n/2^2] > n/5^2 …… [n/2^p] >
n/5^p 随着幂次p的上升,出现2^p的概率会远大于出现5^p的概率。
因此左边的加和一定大于右边的加和,也就是n!质因数分解中,2的次幂一定大于5的次幂

  • 还有一点要注意的就是25这种,5和5相乘的结果,所以,还要看n/5里面有多少个5,也就相当于看n里面有多少个25,还有125,625,,,

  • 例如n=25, n!=25*24*23*…15…*10…*5…*1=(5*5)*24*23(5*3)…(5*2)…(5*1)…*1,其中25可看成5*5,多了一个5,应该加上
    //处理这个问题也很简单,首先对n÷5,移除所有的单个5,然后÷25,移除额外的5,以此类推。下面是归纳出的计算后缀0的公式。
    //n!后缀0的个数 = n!质因子中5的个数= floor(n / 5) + floor(n / 25) + floor(n / 125) + ….

Answer:

public class Solution {    public int trailingZeroes(int n) {        int count=0;        while(n/5 !=0){            n = n / 5;            count += n;        }        return count;    }}
1 0
原创粉丝点击