Given an integer n, return the number of trailing zeroes in n!
这是LeetCode Online Judge上的一个原题:给定一个n,求n!中,末尾0的个数。
- 思路
- n!中0的个数,可以将n!表示成 n!=m*10k,其中k就是题目要求的结果。那么,10k是怎么来的呢?很容易想到,10=2*5,那么,10k=(2*5)k;至此,可以简化成,题目求的是2*5的个数;
- 进一步思考,1*2*3……(n-1)*n,求2*5的个数就是求1-n中2和5的因子总数分别总共有多少个,并且2*5的个数是由min(2个数,5个数)决定的。(1,2,3,4,5……n)每2个数中即最起码有有一个2的因子;而5出现的次数为:每5个中才出现一次5的因子,因此,可以判断,因子5出现的次数远小于因子2。所以此题简化成:求1-n中因子5的个数的总和;
当到这是,很愉快地解决了为题,洋洋洒洒写到以下代码:
class Solution { public: int trailingZeroes(int n) { int count5 = 0; for(int i=1 ; i<=n ; i++) { int temp = i; while (temp%5 == 0) { ++count5; temp /= 5; } } return count5; } };
在LeetCode上一提交,呀,报错了!!!超时了,Last executed input:1808548329。
这时候一百度,看到博客园上有人有更简单的方法啦:http://www.cnblogs.com/ganganloveu/p/4193373.html。仔细一看,很有道理呀,但是有点看不懂,再百度一下,好了,问题全解决了,正确的思路应该继续往下想:
3. 1-n中,只有5的倍数,才含有因子5。1-5,6-10,11-15,16-20,21-25……可以看出,1-n中有n/5个数字是5的倍数;但25的倍数的数字至少应该有2个含5的因子(25=5*5);以此类推,125的倍数的数字至少含有3个5的因子……顾而程序可以修改为:
class Solution { public: int trailingZeroes(int n) { int count5 = 0; while(n) { count5 += n/5; n /= 5; } return count5; } };
完美解决!!!
所以,这题留给我们的思考是,看到代码不要直接提笔就写,要多想,多思考,多推算,有很多方法值得借鉴!!!!
时间: 2024-10-11 01:20:02