使用long而不是int

时间:2015-09-05 19:04:36

标签: java algorithm int long-integer

我正在尝试解决以下问题:

  

给定一个整数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,如果我理解正确,说相反应该发生了)

2 个答案:

答案 0 :(得分:2)

k可能会溢出,这意味着您可能会获得无限循环(即k <= n始终为真的情况,因为k在乘以5时可以回绕到INT_MIN )。

例如,考虑nINT_MAX的情况:如果k <= nk,则int必须为真。

如果klong,那么就没有溢出的可能性。

答案 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永远不会达到足够接近的值),所以溢出将不会发生。