2.尾部的零

Posted 南云之苑

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了2.尾部的零相关的知识,希望对你有一定的参考价值。

题目要求出阶乘尾部后有多少个0,其实就是问阶乘里面有多少个10.所以这个问题也就可以等效于问表示阶乘这个数的质因数分解总共有多少个2与5,而2的个数肯定比5的个数多,所以我们只需要求出有多少个5就行了。而质因数分解一个数里有多少个5可以用公式:\(n/5+n/5/5+n/5/5/5+……\)来进行计算。
很多博客都介绍了这种算法,但是没有讲解具体的计算原理(或许是因为有些简单)。这里,我们假设要求1到100里质因数分解后5的个数,首先肯定是先找5的倍数,即5,10,15,20,25……。注意到它们可以表达为\(5*k\)的形式,即5{1,2,3,4,5,6,7,8,9,10,11……}。而k的表示里又有5的倍数,问题就等价于求m={1,2,3,4,5,6,7,8,9,10,11……}里有多少个5,而m的总数为100/5=20个;显然m={1,2,3,4,5,6,7,8,9,10,11……}里5的倍数又可以表示为
\(5*s\),其中s的个数为20/5(100/5/5)。接下来持续进行上述操作即可。最后5的个数为k+m+s+……
通过这个简单的例子我们可以看出求1到100里有多少个质因数5的过程是迭代进行计算的,即先求出一个数n里有多少个5,在求出n/5里有多少个5,在求出n/5/5/5里有多少个5,以此类推,和我之前提出的算法是相同的。
代码如下:

class Solution {
public:
    /*
     * @param n: A long integer
     * @return: An integer, denote the number of trailing zeros in n!
     */
    long long trailingZeros(long long n) {
        // write your code here, try to do it without arithmetic operators.
         long count=0;  
         while(n>0)  
         {  
             count+=n/5;  
             n=n/5;  
         }  
         return count;
    }
};

以上是关于2.尾部的零的主要内容,如果未能解决你的问题,请参考以下文章

LintCode #2 尾部的零

LintCode 2. 尾部的零

LintCode 尾部的零

2.尾部的零

如何优化C ++代码的以下片段 - 卷中的零交叉

小数去除尾部的0