[LeetCode By Go 98]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.

解題思路

考慮n!的質數因子。后綴0總是由質因子2和質因子5相乘得來的。如果我們可以計數2和5的個數,問題就解決了。考慮下面的例子:

n = 5: 5!的質因子中 (2 * 2 * 2 * 3 * 5)包含一個5和三個2。因而后綴0的個數是1。

n = 11: 11!的質因子中(2^8 * 3^4 * 5^2 * 7)包含兩個5和三個2。于是后綴0的個數就是2。

我們很容易觀察到質因子中2的個數總是大于等于5的個數。因此只要計數5的個數就可以了。那么怎樣計算n!的質因子中所有5的個數呢?
一個簡單的方法是計算floor(n/5)。例如,7!有一個5,因為15 = 5 <= 7,10!有兩個5,因為25 =10 <= 10。除此之外,還有一件事情要考慮。諸如25,125之類的數字有不止一個5。例如,如果我們考慮28!,我們得到一個額外的5,并且0的總數變成了6。處理這個問題也很簡單,首先對n÷5,移除所有的單個5,然后÷25,移除額外的5,以此類推。下面是歸納出的計算后綴0的公式。

n!后綴0的個數 = n!質因子中5的個數 = floor(n/5) + floor(n/25) + floor(n/125) + ....

代碼

func trailingZeroes(n int) int {
    var ret int
    
    for i := 5; n >= i; i = i * 5 {
        ret += n / i
    }
    
    return ret
}
最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。

推薦閱讀更多精彩內容

  • 【1】7,9,-1,5,( ) A、4;B、2;C、-1;D、-3 分析:選D,7+9=16;9+(-1)=8;(...
    Alex_bingo閱讀 19,117評論 1 19
  • 現在的時間是2016年的10月末了,這么算下來,自學的時間也有四個月到五個月了吧。在這期間,一路的跌跌撞撞,其中充...
    Kevin_Jern閱讀 633評論 10 4
  • 人生是一次日出日落 我已是午后的陽光 炙熱 堅決 常態 事業的車輪滾滾 生活的鐘擺安逸祥和 不愁物華繁簡 不懼生老...
    埂中鳴閱讀 501評論 7 10
  • 早上,按時起床、穿衣服、疊被、快速刷牙、洗臉、背書包、出門,一氣呵成! 上課認真聽講、積極回答問題、永遠坐正坐直,...
    上官書函閱讀 841評論 4 7