階乘的一些規律(程式設計之美)
阿新 • • 發佈:2019-02-05
問題一:
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)