LeetCode172 阶乘后的零

题目

给定一个整数 n,返回 n! 结果尾数中零的数量。

示例

  1. 示例 1:
    输入: 3
    输出: 0
    解释: 3! = 6, 尾数中没有零。
  2. 示例 2:
    输入: 5
    输出: 1
    解释: 5! = 120, 尾数中有 1 个零.
    说明: 你算法的时间复杂度应为 O(log n) 。

C++代码

注意,题目中要求的是尾数中的0,而不是阶乘得到的结果中所有的0!
末尾出现0的情况:5的倍数乘以一个偶数;
25=10,425=100,8125=1000
4
25=2525(2个5)
8
125=252525 (3个5)
10=2
5(1个5)
15=35 (1个5)
20=4
5 (1个5)
25=55 (2个5)
75=3
55 (2个5)
125=5
5*5 (3个5)
5!中有1个5的倍数,末尾一共有1个0
10!中有2个5的倍数,末尾一共有2个0
15!中有3个5的倍数,末尾一共有3个0
20!中有4个5的倍数,末尾一共有4个0
25!(15511210043330985984000000) 中有5个5的倍数,1个25的倍数,末尾一共有6个0 (5+1)
50! (30414093201713378043612608166064768844377641568960512000000000000) 中有10个5的倍数,2个25的倍数,末尾一共有12个0 (10+1)
可以归纳推理:n!,n中有x1个5的倍数,x2个25的倍数,x3个125的倍数…,其阶乘末尾的0个数为 x1+x2+x3+…
所以这里的主要问题是求出n!中包含5的倍数的个数、25的倍数的个数…

class Solution {
public:
    int trailingZeroes(int n) 
    {
        int count=0;
        while(n>1) //计算5、25...倍数的个数(从大到小)
        {
            n/=5;
            count+=n;         
        }
        return count;        
    }
};

猜你喜欢

转载自blog.csdn.net/Fang_D/article/details/83187585
今日推荐