zoukankan      html  css  js  c++  java
  • 172. Factorial Trailing Zeroes

    问题:

    求给定n的阶乘结果中,有多少个0。

    Example 1:
    Input: n = 3
    Output: 0
    Explanation: 3! = 6, no trailing zero.
    
    Example 2:
    Input: n = 5
    Output: 1
    Explanation: 5! = 120, one trailing zero.
    
    Example 3:
    Input: n = 0
    Output: 0
    
    Constraints:
    0 <= n <= 104
    

      

    解法:Factorial(阶乘),因数法

    求n!=n*(n-1)*(n-2)*...*5*4*3*2*1

    最后结果中有多少个0。

    也就是因数中,有多少个2*5=10,

    由于含有因数2的乘数,==阶乘因数个数的一半(奇偶成半)。

    而含有因数5的乘数,则相较更少,因此能够构成10的个数,决定于5。

    首先,有多少个乘数中,含有一个5:

    n/5,每五个乘数会有一个含有因数5的乘数。

    n/(5*5),每25个乘数会有一个含有两个因数5的乘数。

    ...

    n/(5*5*...*5)  -> 直到个数>=0

    以此类推。

    计算总共有多少个因数5:

    n/5+n/(5*5)+n/(5*5*5)+...+n/(5*...*5)

    代码参考:

     1 class Solution {
     2 public:
     3     //e.g. 125!
     4     //  125/5: (阶乘乘数1~125中)是5的倍数的数有多少个。a
     5     //  125/(5*5):(阶乘乘数1~125中)是25(2个5作为乘数)的倍数的数有多少个。b
     6     //  125/(5*5*5):(阶乘乘数1~125中)是125(3个5作为乘数)的倍数的数有多少个。c
     7     // 有多少个5可以作为乘数,那么就能构成多少个2*5,构成结果中的 0。
     8     // a+b(这里只计算多余出来的那个5,其中一个5已经包含在a中)+c
     9     //(由于含有2作为乘数的数数量一定>5,因此只需要算有多少个5,与相应数量的2,共同构成结果的0的个数。)
    10     int trailingZeroes(int n) {
    11         int res = 0;
    12         for(int d=n; d/5>0; d=d/5) {
    13             res += d/5;
    14         }
    15         return res;
    16     }
    17 };
  • 相关阅读:
    覆盖式发布与非覆盖式发布
    GIT
    Web Service返回符合Xml Schema规范的Xml文档
    下拉渐显菜单
    计算网页上坐标的距离
    初识交互设计
    良好用户体验-实现过程!
    做 用户调研?
    这个没什么技术含量,实现起来很简单?
    SQL SERVER 登录问题!该用户与可信的Sql Server连接无关联
  • 原文地址:https://www.cnblogs.com/habibah-chang/p/14573619.html
Copyright © 2011-2022 走看看