zoukankan      html  css  js  c++  java
  • LeetCode数学系列(1)——第172解题思路

    题目描述:

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

    示例 1:

    输入: 3
    输出: 0
    解释: 3! = 6, 尾数中没有零。
    示例 2:

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

    解题思路:

    解法一:

    首先肯定不能依赖于把阶乘算出来再去判断有多少个零了,因为阶乘很容易就溢出了,所以先一步一步理一下思路吧。

    首先末尾有多少个 0 ,只需要给当前数乘以一个 10 就可以加一个 0。

    再具体对于 5!,也就是 5 * 4 * 3 * 2 * 1 = 120,我们发现结果会有一个 0,原因就是 2 和 5 相乘构成了一个 10。而对于 10 的话,其实也只有 2 * 5 可以构成,所以我们只需要找有多少对 2/5。

    我们把每个乘数再稍微分解下,看一个例子。

    11! = 11 * 10 * 9 * 8 * 7 * 6 * 5 * 4 * 3 * 2 * 1 = 11 * (2 * 5) * 9 * (4 * 2) * 7 * (3 * 2) * (1 * 5) * (2 * 2) * 3 * (1 * 2) * 1

    对于含有 2 的因子的话是 1 * 2, 2 * 2, 3 * 2, 4 * 2 ...

    对于含有 5 的因子的话是 1 * 5, 2 * 5...

    含有 2 的因子每两个出现一次,含有 5 的因子每 5 个出现一次,所有 2 出现的个数远远多于 5,换言之找到一个 5,一定能找到一个 2 与之配对。所以我们只需要找有多少个 5。

    直接的,我们只需要判断每个累乘的数有多少个 5 的因子即可。

    public int trailingZeroes(int n) {
        int count = 0;
        for (int i = 1; i <= n; i++) {
            int N = i;
            while (N > 0) {
                if (N % 5 == 0) {
                    count++;
                    N /= 5;
                } else {
                    break;
                }
            }
        }
        return count;
    }

    但是这种方法在力扣中是超时的,所以接下来介绍第二种方法

    解法二:

    我们通过方法一的分析可以知道,每隔5个数,就会出现一次因子5;同时每隔25个数,就会出现两次因子5;每隔125个数,就会出现三次因子5...

    所以我们出现5的总个数为:n/5+n/25+n/125+.......

    但这可能分母会超过范围,所以我们可以每次循环n=n/5

    public int trailingZeroes(int n) {
        int count = 0;
        while (n > 0) {
         n /= 5; count
    += n; } return count; }

    我只是搬运工,大神在下面

    作者:windliang
    链接:https://leetcode-cn.com/problems/factorial-trailing-zeroes/solution/xiang-xi-tong-su-de-si-lu-fen-xi-by-windliang-3/
    来源:力扣(LeetCode)
    著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。

  • 相关阅读:
    hihoCoder #1176 : 欧拉路·一 (简单)
    228 Summary Ranges 汇总区间
    227 Basic Calculator II 基本计算器II
    226 Invert Binary Tree 翻转二叉树
    225 Implement Stack using Queues 队列实现栈
    224 Basic Calculator 基本计算器
    223 Rectangle Area 矩形面积
    222 Count Complete Tree Nodes 完全二叉树的节点个数
    221 Maximal Square 最大正方形
    220 Contains Duplicate III 存在重复 III
  • 原文地址:https://www.cnblogs.com/SupremeBoy/p/12257371.html
Copyright © 2011-2022 走看看