• LeetCode172. 阶乘后的零


    参考这个链接

    直接计算阶乘,再求0的个数肯定会溢出,因为阶乘增长的很快。

    所以需要观察一下规律,阶乘里出现0,肯定是能被10整除,而10只能由2*5组成,所以问题就转换为阶乘里有几对2和5.

    由于2每两个数就出现一次,5要每5个数出现一次,所以阶乘里2的数量肯定比5多,所以问题又转换为寻找阶乘里5的数量。

    对于一个比较大的数n,每隔25个数会出现两个5,比如:
    .... * (1 * 5) * ... * (1 * 5 * 5) * ... * (2 * 5 * 5) * ... * (3 * 5 * 5) * ... * n
    ,同理,每隔125(5 * 5 * 5)个数会出现3个5。

    所以5出现的规律是:每隔5个数出现一个5,每隔5 * 5个数出现2个5,每隔5 * 5 * 5个数出现3个5,所以最终5的个数就是 n / 5 + n / 25 + n / 125 + .....

    根据最前面的分析,5出现的次数就是阶乘中0的个数。

    代码如下:

    class Solution {
    public:
        int trailingZeroes(int n) {
            int res = 0;
            while(n > 0) {      // 计算5出现的个数
                n /= 5;
                res += n;
            }
            return res;
        }
    };
    
  • 相关阅读:
    通信中的相干与非相干
    OFDM为什么要在频域内插后做fftshift
    OFDM为什么把高频子载波作为保护频带
    辛几何
    奇文共欣赏
    6G新技术
    高扇出导致的系统异常解决方法

    线程与守护线程
    进程之间的通行
  • 原文地址:https://www.cnblogs.com/linrj/p/13420940.html
Copyright © 2020-2023  润新知