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)
    著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。

  • 相关阅读:
    简易 Javascript DOM 包 | 元素水平垂直居中 | 动态执行 JS 代码 | 获取指定元素
    POSIX 风格和兼容 Perl 风格两种正则表达式主要函数的类比(preg_match, preg_replace, ereg, ereg_replace)
    算法分析_运行时间计算的一般法则C 语言复习
    函数执行效率的小比较PHP 函数学习
    最大子序列问题及其求解C 语言学习
    选择排序(Selection Sort) C 语言学习
    求两个正整数的最大公因子C 语言复习
    国外十大最流行 PHP 框架排名(转)
    将一个整数的各位数字颠倒后输出(C 语言)
    还是 push 比较好
  • 原文地址:https://www.cnblogs.com/SupremeBoy/p/12257371.html
Copyright © 2011-2022 走看看