設計乙個演算法,計算出n階乘中尾部零的個數

2021-10-07 20:50:34 字數 1359 閱讀 1489

樣例  1:

輸入: 11

輸出: 2

樣例解釋:

11! = 39916800, 結尾的0有2個。

樣例 2:

輸入: 5

輸出: 1

樣例解釋:

5! = 120, 結尾的0有1個。

思想一:碰到這個問題可能首先想到的就是用乙個for迴圈得到n的階乘,然後在算出末尾有幾個零,這種思想只能在n的階乘在資料型別範圍內,才能正確。一旦n的階乘超過了資料型別的範圍後,那麼就無法滿足,最終無法測試通過。比如n=2356050006340;

在執行過程中就無法得到想要的結果。所以這種方法只能檢測一些小資料的階乘,無法測試大型資料。

思想二:如果深入思考發現每從1開始,每5個數字就能產生末尾0,例如:,把這些數字抽調出來就變成了一下形式:,這些數字其實是都能滿足5*k的數字,是5的倍數。統計一下他們的數量:n1=n/5。比如如果是101,則101之前應該是5,10,15,20,...,95,100101/5=20個數字滿足要求。

2、將1中的這些數碼化成5*(1、2、3、4、5、...)的形式,內部的1、2、3、4、5、...又滿足上面的分析:每5個數字有乙個是5的倍數。抽取為:...、25、...、50、...、75、...、100、...、125、...

而這些數字都是25的倍數(5的2次冪的倍數),自然也都滿足5*k的要求。

這些數字是25、50、75、100、125、...=5*(5、10、15、20、25、...)=5*5*(1、2、3、4、5、...),內部的1、2、3、4、5、...又滿足上面的分析,因此後續的操作重複上述步驟即可。

統計一下第二次中滿足條件的數字數量:n2=n/5/5,101/25=(101/5)/5=4。

因為25、50、75、100、125、...它們都滿足相乘後產生至少兩個0,在第一次5*k分析中已經統計過一次。對於n=101,是20。因此此處的5*5*k只要統計一次4即可,不需要根據25是5的二次冪統計兩次。

後面的125,250,...等乘積為1000的可以為結果貢獻3個0的數字,只要在5*5*k的基礎上再統計一次n3=((n/5)/5)/5即可。

尾部的零 設計乙個演算法,計算出n階乘中尾部零的個數

思路 乙個n的階乘未尾有多少個 0 取決於 1 到 n 的各個因子中 2 和 5 的個數,而2的個數是遠遠多於5的個數的,因此求出5的個數即可。題解中給出的求解因子 5 的個數的方法是用 n 不斷除以 5,直到結果為 0,然後把中間得到的結果累加.例如,100 5 20,20 5 4,4 5 0 則...

lintCode 2 計算出n階乘中尾部零的個數

描述 樣例 1 輸入 11 輸出 2 樣例解釋 11 39916800,結尾的0有2個。樣例 2 輸入 5 輸出 1 樣例解釋 5 120,結尾的0有1個。將n!先算出來,再數 零 的個數。存在問題,不可取,階乘資料過大,會產生溢位,而且複雜度較高。為什麼要數5和2的個數?舉例 5 4 3 2 1 ...

如何精確計算出乙個演算法的CPU執行時間

在程式中嵌入彙編語句,直接讀出cpu的機器週期。你需要多精確?gettickcount可以到18 20ms進度 timegettime可以到1ms精度 當然這些都不是c or c 標準支援的。那麼就要祭出最牛奔的方法,直接讀取cpu開機以來執行的機器週期數,一條彙編指令 rdtsc 就是 read ...