我正在尝试解决以下问题:
给定一个整数n,返回n!中的尾随零数。
注意:您的解决方案应该具有对数时间复杂度。
我提交了以下代码,这些代码被拒绝太慢了:
public int trailingZeroes(int n) {
int result = 0;
int k = 5;
while (k <= n){
result += n / k;
k *= 5;
}
return result;
}
但是当我将变量k更改为long时,它足够快/
为什么当我将k声明为long而不是int时它会更快? (我读了this question,如果我理解正确,说相反应该发生了)
答案 0 :(得分:2)
k
可能会溢出,这意味着您可能会获得无限循环(即k <= n
始终为真的情况,因为k
在乘以5时可以回绕到INT_MIN
)。
例如,考虑n
为INT_MAX
的情况:如果k <= n
为k
,则int
必须为真。
如果k
是long
,那么就没有溢出的可能性。
答案 1 :(得分:2)
@Tinaki的评论可能就是这笔钱。如果您的n
大于Integer.MAX_VALUE / 5
,则k
可能会达到大于Integer.MAX_VALUE / 5
的值,然后在乘以5后,它会溢出并变为一个小数字再次,所以你的程序永远不会终止。
然而,如果k
很长,那么它的值是否大于Integer.MAX_VALUE / 5
并不重要;只要它小于Long.MAX_VALUE / 5
(由于n
是一个int而且ints永远不会达到足够接近的值),所以溢出将不会发生。