TheScenery's Blog

N阶乘尾部0的个数

· 70 words · 1 minutes to read

偶然看到一个比较有意思的问题,计算N!的结尾到底有多少个0,其中一些解法,确实给自己带来了很多新颖的视角,特地记录下来。

问题描述 🔗

给定一个整数N, 那么N!的末尾到底有多少个0?

例如: N = 10, 则N!为3628800, 那么其结尾有两个0.

解决方案 🔗

最直接,也是直接就想到的,就是现算出N!是多少,然后看能整除10多少次,就可以统计出来最后有多少个0了。但转念一想N阶乘的增长幅度非常大。可能N稍微大一点,就会溢出。虽然这个方法,不科学,但还是感兴趣的去试了一下。

const factorial = (n) => n === 1 ? 1 : n * factorial(n - 1);

试着算了下,JS当中,算到19时,其结果已经超出了MAX_SAFE_INTEGER了。

第二种,转换角度,既然硬算不合适,而且最后算出结果之后还需要,看能被10整除多少次,那何不看在相乘的过程中总共会出现多少个10呢。即寻找最多可以促出多少个2 * 5。在计算阶乘的过程中,没两个数就会有一个能被2整除,但每5个数才会出现一个能被5整除的,所以只要有能找到5,则肯定有足够多的2可以和其促成一对。所以问题变成了,在阶乘序列中,能分解出多少个5.

function tailZero(n) {
    let total = 0;
    for (let i = 1; i <=n; i++) {
        let t = i;
        while (t % 5 === 0) {
            total++;
            t /= 5;
        }
    }
    console.log('tail zeros:', total)
}

测试程序地址

Tags