n!尾部0個數問題
阿新 • • 發佈:2018-11-06
n!尾部0個數問題
描述
n!計算尾部有多少個0
分析
可以先計算出結果,再通過取餘的方式,計算有多少個0.
但這種方式時間複雜度就是O(n) (while迴圈n次相乘)
挑戰
時間複雜度O(logn)
再次分析
n! = 1 x 2 x 3 x 4 x 5 x ... x n;
相當於可以湊多少個10
出來,即2x5
出來(10=2x5
,沒有別的質數組合),
n! = 1 x 2 x 3 x 4 x 5 x ... x n = 1 x 2 x 3 x (2 x 2) x 5 x ... x n;
如果n = 11
,則相當於
11 = 1 x 2 x 3 x (2 x 2) x 5 x (2 x 3) x 7 x (2 x 2 x 2) x (3 x 3) x (2 x 5) x 11;
因為2
的個數始終大於5
的個數,相當於找5
有多少個,即0
有多少個.從1-11
每過5
有一個5
.
當n = 26
時
26 = 1 x 2 x 3 x (2 x 2) x 5 x ... x (5 x 5) x (2 x 13);
即每過一個25
,會有兩個5
出現.
同理,每過一個125 =
53 個5
出現.依次類推.
所以,可以計算1-n
有多少個5
= 51,有多少個25
= 52,有多少個125
0
的個數.
程式碼實現:
執行沒有問題,也通過了執行程式碼,但是提交出錯
int trailingZeros(int n) {
int sum = 0;
int i = 1;
while (pow(5, i) <= n) {
sum += n / pow(5, i);
i++;
}
return sum;
}
這段程式碼可以
int trailing(int n) {
int sum = 0;
while (n > 0) {
sum += n / 5;
n /= 5;
}
return sum;
}