原題描述:測試
原題地址: Factorial Trailing Zeroescode
題目描述很直接, 給出一個整數N, 求這個N的階乘後尾有幾個零。(要求O(logN)時間複雜度)blog
我的思路:遞歸
一開始,最簡單的思惟就是直接求要知道, n!的增加速度, 比O(n^2)還要大, 對於32位整型來講, 當N=13的時候, 數據就已經開始溢出了, leetcode
好吧, 就算使用long型也是到N=21時,表示數位也不夠用了,get
那麼, 這條路實際上是走不通的, (就算考慮使用大數階乘解決方案, 但這背離了這道題目的初衷,並且也達不到O(logN)的時間複雜度要求):im
到這裏, 咱們先想一想,1~10這十個數字,那些數相乘後有末尾零,也就是10的倍數?,顯而易見的,只有碰到任意的偶數與5的倍數相乘是,纔有得nw
纔會多出一個零。 從而, 咱們這邊5的倍數這個元素就是關鍵點。數據
其實,到了上一步,這個問題已經解決掉一半了, 剩下的工做就是求取給出的1~N個數裏, 存在幾個5的倍數, done!img
當時我就以爲問題已經解決,並且時間複雜度只有O(1)呢 : )
立刻提交, 結果呵呵:Wrong Anwser
可是以爲30裏不就6個5的倍數麼, 獲得的數尾應該就是6個零纔對啊,而後我仔細盯着着這6個數:
機智的朋友們應該一經發現了, 但是我卻呆了一會才發現, 老子當時就是一拍大腿: "臥槽, 還有一種狀況沒有考慮!"
沒錯, 就是這個罪魁禍首, 雖然他也是5的倍數, 可是他是5的n次數(包括其倍數, 例如25*4 = 100,100/10 = 10, 仍是5的倍數,就是這種狀況沒考慮), 也就是意味他須要n次消化掉纔不會有, 既然還要考慮到5的n次, 那麼, 每次每隔5一次數, 而後再在結果中隔5取一次數, done!
此次也是果斷提交(時間複雜度 O(log(N)), 底數爲5, 確定比默認底數爲2來的更快。):duang!
另外, 關於執行速度, 貌似用C的話, 遞歸反而是最快的, 我估計是測試用例的問題吧, 反正不在今天的討論範圍,有興趣的同窗本身研究下,或者在評論區指教下,謝謝!