设计一个算法,计算出n阶乘中尾部零的个数
样例
样例 1:
输入: 11
输出: 2
样例解释:
11! = 39916800, 结尾的0有2个。
样例 2:
输入: 5
输出: 1
样例解释:
5! = 120, 结尾的0有1个。
这个题很多人都分析出了只要判断n/5以及n/5^2, 一直到n/5^m, 把他们累加起来就可以了。其中m要求n>5^m.
我的第一种答案也是这么做的,
long long trailingZeros(long long n) {
// write your code here, try to do it without arithmetic operators.
//m与n比较,a是m刚好大于n时的数字,5的多少次方
long long m=5,a=1;
while(m<n){
m=m*5;
a++;
}
//count与a比较,num是最结果,h记录中间过程。
long long count=1;
long long num=0;
long long h=1;
while(count<a){
for(int i=0; i<count; i++){
h = h*5;
}
num = num+n/h;
count++;
h=1;
}
return num;
}
后来我发现这种解法写的复杂了,应该有更简单的解法,于是写出来下一种解法:
long long trailingZeros(long long n) {
// write your code here, try to do it without arithmetic operators.
long long num = 0;
while(n>0){
num = num + n/5;
n = n/5;
}
return num;
}
在这里有一个非常重要的事,那就是变量的定义类型,由于测试数据中会有非常大的数字,使用int类型无法满足要求,因此要使用long long类型,这也是之前一直困扰我的地方。

本文介绍了一种计算n阶乘尾部零个数的高效算法,通过分析得出只需判断n除以5及其幂次直到n大于5的m次方即可。提供了两种实现方式,强调了使用long long类型变量的重要性。

被折叠的 条评论
为什么被折叠?



