Given an integer n, return the number of trailing zeroes in n!.
Note: Your solution should be in logarithmic time complexity.
s思路: 1. n!中零的个数是因为有2,5这两个因子。我们就去找有多少个5,多少个2,然后这两个数的最小者决定了0的个数。严格的说,必须都计算,但是从得到结果的角度思考,由于5比2少,所以只需要知道有多少个5即可。 2. 比如:50!50/5就可以得到5的倍数的个数。第一次做的时候,就以为这就完了。其实没完,因为这两者不能直接划等号,比如:5的倍数是5,10,15,20,25,30,35,40,45,50.注意到,25和50各含有两个5.也就是说,5的倍数的个数不完全等于5的个数。换句话说,5的倍数的个数不严格等于5的个数,但是非常接近。现在的问题,就是如何修正?自己之前想到这里,就不知所措,除了stick这个方法就是quit这个方法,忘了还有一条路,就是继续使用这个方法往后走,比如:50/5=10,把10/5=2,2/5=0,就是一个iterative的过程。也就是说,这个结果不是一蹴而就就能得到,必须允许分步走。这道题的思路自然就出来! 3. 分步iterative走,经常是把一个方法多次运用,逐渐逼近事物真相!
class Solution {public: int trailingZeroes(int n) { // int res=0; while(n){ n/=5; res+=n; } return res; }};新闻热点
疑难解答