LeetCode 172.FactorialTrailingZeroes(階乘後的零)
阿新 • • 發佈:2018-12-14
題目
給定一個整數 n, 返回 結果尾數中零的個數。 示例1
輸入: 3
輸出: 0
解釋: 3! = 6, 尾數中沒有零。
示例2
輸入: 5
輸出: 1
解釋: 5! = 120, 尾數中有 1 個零.
說明: 演算法的時間複雜度應為
方法一(錯誤的)
求出 的值或者在求的過程中,遇到末尾有0,先除以10來減小數,雖然該演算法原理上可以行,但是有兩個問題,一、時間複雜度為 ,二、結果不對,出現這個問題的原因是程式語言每種型別有自己的陣列範圍,因此會溢位。所以該方法實際不可行
方法二
考慮一個問題,位數為零是由2*5產生的,而吧每個數分解,出現5的次數必出現2的次數要少很多,因此,我們通過統計有多少個 5 即可判斷尾數有多少個 0.先上程式碼在將原理
public class LeetCode_172 {
public int trailingZeroes2(int n) {
int count = 0;
while (n > 0) {
count += n / 5;
n /= 5;
}
return count;
}
public static void main(String[] args) {
LeetCode_172 leetCode = new LeetCode_172();
System. out.println(leetCode.trailingZeroes(3));
System.out.println(leetCode.trailingZeroes(5));
System.out.println(leetCode.trailingZeroes(16));
}
}
首先我們先統計n 包含一個5的個數,然後統計包含兩個5的個數,依次類推。比如:35!,包含一個5的個數為5,10, 15, 20, 25, 30, 35,即35/5 = 7個,然而當我們遇到25的元素時,裡面包含兩個5,所以通過 ,更大的數一次類推,當 時即停止,在上面程式碼中表現為n>0;