1. 程式人生 > >leetcode-172-Factorial Trailing Zeroes

leetcode-172-Factorial Trailing Zeroes

一個數 復雜度 cpp sub mic tco tor res not

題目描述:

Given an integer n, return the number of trailing zeroes in n!.

Note: Your solution should be in logarithmic time complexity.

要完成的函數:

int trailingZeroes(int n)

說明:

1、這道題目要求輸出n!中從後面數起有多少個連續的0。時間復雜度要求是O(log)。

2、首先我們肯定不能直接計算,100!已經超過c++能處理的乘數範圍了。所以我們只能仔細分析,看能不能找到一些數學規律,來統計有多少個連續的0。而且題目這種問法很明顯就是要運用數學方法的。

3、經過計算,我們得到如下數據:

1!  1     0個0

2!  2     0個0

3!  6     0個0

4!  24     0個0

5!  120    1個0

6!  720    1個0

7!  5040     1個0

8!  40320   1個0

9!  362880   1個0

10!  3628800  2個0

11! 39916800 2個0

我們可以看到5!以前都是沒有0的,直到24*5=120才出現了第一個0,後續再乘以6,乘以7,乘以8,乘以9都沒有出現第二個0,直到乘以10再出現了第二個0。

乘以10會出現第二個0,歸根結底是因為乘以了5。因為在n!中2都是充足的,只要出現了5就可以再添上一個0。

除了10=2*5之外,沒有其他任何情況會生成10。

那這樣子我們也可以統計出:

12!        2個0

13!        2個0

14!        2個0

15!        3個0 因為又乘以15=3*5,又添上一個0

似乎5的倍數都會添上一個0呢!

那20!       4個0   因為又乘以20=4*5,又添上一個0

25!        6個0 因為又乘以25=5*5,出現了2個5,所以又添上兩個0

30!       7個0   因為又乘以30=6*5,又添上一個0

35!       8個0   因為又乘以35=7*5,又添上一個0

40!        9個0   因為又乘以40=8*5,又添上一個0

45!       10個0   因為又乘以45=9*5,又添上一個0

50!       12個0   因為又乘以50=2*5*5,又添上兩個0

到這裏,我們似乎可以總結出規律了,25!之所以會有6個0,是因為25/5=5,前面有5個5的間隔了(5、10、15、20、25),然後25=1*5*5,又出現一個5,所以加起來會有6個0.

50!之所以會有12個0,是因為50/5=10,前面有10個5的間隔了,然後50=2*5*5,有2個5,所以要再加上2。

75=3*5*5,所以會有18個0,75/5=15,再加上3個0,,構成18個0。

100=4*5*5,所以會有24個0,100/5=20,再加上4個0,構成24個0。

125=1*5*5*5,所以會有31個0,125/5=25,再加上5個0,再加上1個0,構成31個0。

所以對於每一個數,其實我們可以看一下,它除以5等於多少,result初始為0再加上這個數,然後這個數再除以5,看看等於多少,result再加上,然後這個數再除以5,result再加上……直到這個數最後為0。

代碼如下。

代碼:

int trailingZeroes(int n) 
{
        int result=0;
        while(n)
        {
            n/=5;
            result+=n;
        }
        return result;
}

非常簡潔,時間復雜度也滿足要求,beats 100% of cpp submissions。

leetcode-172-Factorial Trailing Zeroes