在編程中遇到很多Math相關(guān)的問題都可以轉(zhuǎn)換為求n的階乘中含有某個(gè)數(shù)的個(gè)數(shù);
例如這道:
172. Factorial Trailing Zeroes
Given an integer *n*, return the number of trailing zeroes in *n*!.
**Note: **Your solution should be in logarithmic time complexity.
這道題的解題關(guān)鍵是:分解因子, 當(dāng)且僅當(dāng) 因子中出現(xiàn) 一對 (2,5)時(shí), 最后結(jié)果會(huì)增加一個(gè) trailing zero.分析可知,因子中出現(xiàn)2的次數(shù)要遠(yuǎn)大于5,因此,只需要計(jì)算出將n!因式分解之后5的個(gè)數(shù).
因此,問題就變成了計(jì)算n的階乘中含多少個(gè)5的問題.
分析一下30!中含有多少個(gè)具有5的質(zhì)因數(shù)
第一次:5、10、15、20、25、30 共6個(gè)
第二次:1、2、3、4、5、6共一個(gè)
第三次:沒有
公式f(x) = f(n) = (n/5) + (n/25) + ...
同理,分析一下8!中含有多少個(gè)具有2的質(zhì)因數(shù)
8! 有1 2 3 4 5 6 7 8
第一次 則它有 2 4 6 8四個(gè)具有2的質(zhì)因數(shù)
第二次 2 4 6 8變?yōu)?1 2 3 4 則只有 2 4具有2的質(zhì)因數(shù)
第三次 2 4 變?yōu)?1 2 則只有2 具有2的質(zhì)因數(shù)
公式 f(n) = (n/2) + (n/4) + (n/8) + (n/16) + ...
因此,上題的代碼就可以寫成:
class Solution {
public:
int trailingZeroes(int n) {//質(zhì)因數(shù)分解,因?yàn)樽罱K尾部0的個(gè)數(shù)由質(zhì)因子中2和5的個(gè)數(shù)決定,min(2,5),而5的個(gè)數(shù)遠(yuǎn)小于2,因此只需要求出5個(gè)數(shù)
int ret = 0;
while(n)
{
ret += n/5;
n /= 5;
}
return ret;
}
};
此外,求N!的二進(jìn)制表示中最低位1的位置也可以轉(zhuǎn)化為求N!中質(zhì)因子2的個(gè)數(shù);