1. 程式人生 > >階乘的一些規律(程式設計之美)

階乘的一些規律(程式設計之美)

問題一:

N!末尾有多少個0?

問題二:

N!二進位制表示中最低位1的位置?

首先來介紹幾個要點和規律:

n! = n(n - 1)!    (n > 0) 

n! = 1 (n = 0)   這裡注意不要忘了

問題一等價轉化 <=> N! 的質因數中有多少個10

問題二等價轉化 <=> N! 的質因數中有多少個2

我們首先介紹一個公式:N! 中一共有多少個素因子(此處必須為素因子)為k.

Z = [N / k] + [N / k ^ 2] + ....+ [N / k ^ p] 其中[k ^ p > N];  這個公式數論裡面應該也經常用到,get一發。

附一發常規的解法

int solve(int data, int x)
{
    int cnt = 0;
    while(data % x == 0) cnt ++;
}

M = min(X, Z) X, Z 分別為 N! 中2,5的素因子的個數

int solve(int data, int x)
{
    int cnt = 0;
    while(data) cnt += (data /= x);
    return cnt;
}

int main()
{
    int n;
    scanf("%d", &n);
    cout << min(solve(n, 2), solve(n, 5)) << endl;
}

對於問題二的話:

除了上面的做法之外,還有一些更加炸天的做法

N!含有質因數2的個數,還等於N 減去 N 的二進位制表示中1的數目。(有興趣的話可以自行證明一發)

int solve(int data)
{
    int cnt = data;
    while(data){
        data &= data - 1;
        cnt --;
    }
    return cnt;
}

對於給定整數,判斷它是否為2的方冪

n > 0 && (n &(n - 1) == 0)