问题描述:
设计一个算法,计算出n阶乘中尾部零的个数
样例
11! = 39916800,因此应该返回 2.
这个问题相信很多老铁都已经遇到过了,很经典的一个题目,还是那句老话,重要的是考虑的过程,是如何想到以5的个数来统计0的个数呢?又是如何想到除以25、除以125... ...的呢?这些事重点。
首先n!中,哪些数字相乘可能会出现0呢,最简单的也是最根本的2*5(即使是10、20... ...也是由2*5构成的呀),而2的个数太多,所以只需要去统计5的个数,因为5的个数决定了0的个数。具体分析见代码注释。
#include <iostream>
using namespace std;
/*
1、 每隔 5个,会产生一个0,比如 5, 10 ,15,20.。。
2 、每隔 5×5 个会多产生出一个0,比如 25,50,75,100 (比如说25,在统计5的个数时,只计数了一次5的个数,但实际上25由两个5组成,少统计一个5,在这里再统计一遍能被25整除的个数补上。)
3 、每隔 5×5×5 会多出一个0,比如125.(道理同上)
... ...
*/
long long trailingZeros(long long n)
{
// 统计5的个数
long long m = 5;
long long count = 0;
while (n / m > 0)
{
cout << " n / m : " << n / m << endl;
count += n / m;
m *= 5;
}
return count;
}
int main ()
{
cout << trailingZeros(52) << endl;
system("pause");
return 0;
}
在LintCode上测试通过,AC100%.
注意我一开始在定义时m和count定义为int型,但是不能全部AC,因为int和long long表示的数长度不一样,所以还是要注意。
在这里就顺便复习下int和long long表示整数时的区别:int 2147483648~2147483647; long long :-9223372036854775807~9223372036854775808
有什么意见欢迎留言,您的支持是我最大的努力~