描述
n!计算尾部有多少个0
分析
可以先计算出结果,再通过取余的方式,计算有多少个0.
但这种方式时间复杂度就是O(n) (while循环n次相乘)
挑战
时间复杂度O(logn)
再次分析
n! = 1 x 2 x 3 x 4 x 5 x ... x n;
相当于可以凑多少个10
出来,即2x5
出来(10=2x5
,没有别的质数组合),
n! = 1 x 2 x 3 x 4 x 5 x ... x n = 1 x 2 x 3 x (2 x 2) x 5 x ... x n;
如果n = 11
,则相当于
11 = 1 x 2 x 3 x (2 x 2) x 5 x (2 x 3) x 7 x (2 x 2 x 2) x (3 x 3) x (2 x 5) x 11;
因为2
的个数始终大于5
的个数,相当于找5
有多少个,即0
有多少个.从1-11
每过5
有一个5
.
当n = 26
时
26 = 1 x 2 x 3 x (2 x 2) x 5 x ... x (5 x 5) x (2 x 13);
即每过一个25
,会有两个5
出现.
同理,每过一个125 =
53 个5
出现.依次类推.
所以,可以计算1-n
有多少个5
= 51,有多少个25
= 52,有多少个125
= 53…依次累加,就是0
的个数.
代码实现:
运行没有问题,也通过了运行代码,但是提交出错
int trailingZeros(int n) {
int sum = 0;
int i = 1;
while (pow(5, i) <= n) {
sum += n / pow(5, i);
i++;
}
return sum;
}
这段代码可以
int trailing(int n) {
int sum = 0;
while (n > 0) {
sum += n / 5;
n /= 5;
}
return sum;
}