n的阶乘中用多少个2,3,5,7因数

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了n的阶乘中用多少个2,3,5,7因数相关的知识,希望对你有一定的参考价值。

举个例子,30的阶乘有多少个2因数,也就是有多少个2相乘

用[n]表示不超过n的最大整数,例如[3.5]=3,[0.87]=0,[-4.55]=-5

30的阶乘中2的个数
=[30/2]+[30/2^2]+[30/2^3]+[30/2^4]
=15+7+3+1
=26
30的阶乘有26个2
这种算法可以用于对阶乘进行分解质因数。比如要计算100的阶乘等于多少,直接计算1乘2乘3一直乘到100,非常麻烦,数字也非常大。这时候就可以用这种算法直接去计算100的阶乘的质因数分解式
参考技术A 欢迎追问
3×5=15
能75

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;
    }
};

以上是关于n的阶乘中用多少个2,3,5,7因数的主要内容,如果未能解决你的问题,请参考以下文章

2.尾部的零

关于阶乘

请问计算n的阶乘末尾有多少个0

阶乘因式分解 给定两个数m,n,其中m是一个素数。 将n(0<=n<=10000)的阶乘分解质因数,求其中有多少个m。 输入第一行是一个整数s(0<s<=100)

2017.10.30

CH3101 阶乘分解