在編程中遇到很多Math相關(guān)的問(wè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) 一對(duì) (2,5)時(shí), 最后結(jié)果會(huì)增加一個(gè) trailing zero.分析可知鞭光,因子中出現(xiàn)2的次數(shù)要遠(yuǎn)大于5扳剿,因此,只需要計(jì)算出將n!因式分解之后5的個(gè)數(shù).
因此步藕,問(wèn)題就變成了計(jì)算n的階乘中含多少個(gè)5的問(wèn)題.
分析一下30!中含有多少個(gè)具有5的質(zhì)因數(shù)
第一次:5、10、15谭贪、20、25锦担、30 共6個(gè)
第二次:1俭识、2、3洞渔、4套媚、5缚态、6共一個(gè)
第三次:沒(méi)有
公式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) + ...
因此堤瘤,上題的代碼就可以寫(xiě)成:
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ù)慎皱;