求n的階層中含有某個因子個數的快速運算

摘自博客園- 海子 

求n的階乘某個因子a的個數,如果n比較小,可以直接算出來,但是如果n很大,此時n!超出了數據的表示範圍,這種直接求的方法肯定行不通。其實n!可以表示成統一的方式。

n!=(k^m)*(m!)*a   其中k是該因子,m=n/k,a是不含因子k的數的乘積

下面推導這個公式

n!=n*(n-1)*(n-2)*......3*2*1

   =(k*2k*3k.....*mk)*a      a是不含因子k的數的乘積,顯然m=n/k;

   =(k^m)*(1*2*3...*m)*a

   =k^m*m!*a

接下來按照相同的方法可以求出m!中含有因子k的個數。

因此就可以求除n!中因子k(k爲素數)的個數

int count(int n,int k)
{
    int num=0;
    while(n)
    {
        num+=n/k;
        n/=k;
    }
    return num;
}


`

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章