力扣【阶乘问题】leetcode-172、阶乘后的零;leetcode-793、阶乘后K个零;
目錄
- 題目一:172、階乘后的零
- 題目二:793、階乘后K個零
題目一:172、階乘后的零
給定一個整數(shù) n,返回 n! 結(jié)果中,尾數(shù)中零的數(shù)量
舉一個栗子:6!=【 1 * 2 * 3 * 4 * 5 * 6 】
6!= 720
所以的話就是返回1,因為720 后面只有一個0
1、那么應該怎么做呢?
乍一看,感覺問題很復雜,其實只要冷靜下來,一步一步簡化,結(jié)果是十分明了的~
第一個想法:首先把階乘算出來,然后從前到后每一位都遍歷嗎?
這個方法肯定是不可取的,復雜度太高了。
2、我們只需要簡單分析一下
題目要求看 0 的數(shù)量 ,
1、末尾的0 是從哪里來的?
肯定是乘以 10 得來的!
2、10 是從哪里來的?
10 = 2 * 5;也就是說,10 只能從2 和5 相乘得到;
只看 2 和 5 出現(xiàn)的次數(shù),因為只有2 和 5 才會產(chǎn)生 10 ,才會有 0 的呀!
當然,這里要多說一嘴,0 就不要考慮了,因為 0!= 1 啊。
3、問題就做可以做第一次簡化:
判斷n!= 【1 * 2 * 3 * …… * n 】 中到底有多少個 2 和 5 的組合?
隨后,我們繼續(xù)分析,還可以繼續(xù)優(yōu)化;
10 從 2 * 5 中得到,單單一個 2 或者 一個 5 ,或者和其它組合,都是沒法產(chǎn)出 10 的1、只有一個2 一個5 結(jié)合在一起才行
2、進一步,2多 5 少呢?5多 2 少呢?
自然是根據(jù)少的來嘛!
4、我們再舉幾個栗子分析
6!=【 1 * 2 * 3 * 4 * 5 * 6 】 6 = 2 * 3;
所以兩個 2 ,一個5,于是一個10,
10! =【 1 * 2 * 3 * 4 * 5 * 6 * 7 * 8 * 9 * 10】
2 4 6 8 10 都可以出來2 ,一共七個2;5= 1 *5;10 = 2 * 5;
一共兩個5;所以兩個10
不難看出,2 的個數(shù)是 大于等于 5 的個數(shù)的;這也是我們第二次簡化的依據(jù)
5、問題就做第二次簡化:
判斷 n!= 【1 * 2 * 3 * …… * n 】 中到底乘了多少個 5
這樣一來,問題就簡單很多了!
注意:問題到這里就分析完了嗎?當然沒有,我們還應該注意以下這樣的數(shù)字:
10 = 2 * 5 貢獻1個5
5 = 3 * 5 貢獻1個5
25 = 5 * 5 貢獻2個5
125 = 5 * 5 * 5 貢獻3個5
以此類推~ 這些數(shù)字都是我們應該處理的
有了上述的分析和注意點,我們便可以寫出代碼了
class Solution { public: int trailingZeroes(int n) { int count = 0; while(n >= 5) { count += n / 5; n /= 5; } return count; } };題目二:793、階乘后K個零
1、題目描述:給你一個數(shù)字 k ,找出有多少個非負整數(shù) n,使得 n! 后方,有k個0注意: k 是范圍在 [0,10^9]的整數(shù)
說實話這個題有一點數(shù)學了,但是依舊是那一個解題步驟逐步分析!簡化!
簡單分析:通過上一題,我們可以知道,只有10的倍數(shù),才會有0每有一對2和5的組合,n! 后面就會多一個0而 n!展開中,2個數(shù)比5個數(shù)多問題就轉(zhuǎn)化為 n! 有多少個 5 作為因子
既得: n 的階乘末尾 0 的個數(shù) 為:k;
滿足公式:k = n/5 + n/5^2 + n/5^3 + ……
根據(jù)條件: k 是范圍在 [0,10^9]的整數(shù)
得到:n < 5 *10^9
2、n 每+5,階乘就會至少多乘一個5,末尾就會至少多一個0
有解,那就是5個,如果無解就是0個!
只有這兩個情況!
n可以取這么大的數(shù)?該如何解題呢?
3、二分法 降維打擊!
總結(jié)
以上是生活随笔為你收集整理的力扣【阶乘问题】leetcode-172、阶乘后的零;leetcode-793、阶乘后K个零;的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 排序算法 | 直接插入排序算法的图解、实
- 下一篇: 位运算的那些奇技淫巧 | 掌(装)握(