【leetcode】172. Factorial Trailing Zeroes

来源:互联网 发布:聊聊语音聊天网mac 编辑:程序博客网 时间:2024/05/19 11:45

题目:

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

    Note: Your solution should be in logarithmic time complexity.

翻译:

    给定一个正整数n,在O(logn)的时间复杂度下,求出n的阶乘的最后包含多少个连续的0。

思路:

    以下文字转自:http://www.2cto.com/kf/201512/454453.html

    考虑n!的质数因子。后缀0总是由质因子2和质因子5相乘得来的,如果我们可以计数2和5的个数,问题就解决了。
    考虑例子:n = 5时,5!的质因子中(2 * 2 * 2 * 3 * 5)包含一个5和三个2。因而后缀0的个数是1。
    n = 11时,11!的质因子中((2 ^ 8) * (3 ^ 4) * (5 ^ 2) * 7)包含两个5和八个2。于是后缀0的个数就是2。
    我们很容易观察到质因子中2的个数总是大于等于5的个数,因此只要计数5的个数即可。
    那么怎样计算n!的质因子中所有5的个数呢?一个简单的方法是计算floor(n / 5)。例如,7!有一个5,10!有两个5。
    除此之外,还有一件事情要考虑。诸如25,125之类的数字有不止一个5。
    例如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
)+...

代码:

<span style="font-size:18px;">class Solution {public:int trailingZeroes(int n) {return n == 0 ? 0 : n / 5 + trailingZeroes(n / 5);}};</span>
结果:



0 0
原创粉丝点击