【问题标题】:How does index*int in a for loop end up with zero as result?for 循环中的 index*int 如何以零作为结果?
【发布时间】:2018-01-16 23:18:10
【问题描述】:

我们只是为了好玩才尝试创建一个如下所示的 for 循环。我们假设我们得到的数字会非常高,但我们得到了 0。为什么它是 0 而不是什么大的东西? 我们甚至用 long 尝试过,因为我们认为它可能比 int 大。 提前致谢。

private static void calculate() {
    int currentSolution = 1;
    for (int i = 1; i < 100; i++) {
        currentSolution *= i;
    }
    System.out.println(currentSolution);
}

【问题讨论】:

    标签: java for-loop int


    【解决方案1】:

    当您的int 到达+2147483647 时,它正在环绕到-2147483648

    一个惊人的巧合1,在您的产品中引入了乘以零。

    自己看:写

    if (currentSolution == 0){
        // What is the value of i?
    }
    

    您需要BigInteger 来评估 100!。


    1 真的没有那么神奇:只有 100 个!有 232 作为因子。

    【讨论】:

    • i 达到 34 时会发生这种情况。currentSolution 变为并保持为 0。
    • 当 i 的值为 32 和 33 时 currentSolution 的值相同,这是为什么呢
    • 只要按照 Java 中的 int 溢出规则手动进行乘法运算,您就会看到(当然假设您的方法是正确的)。
    • 这不是一个惊人的巧合,lf currentSolution 的值超出了 int 的范围。
    • @ArunSudhakaran 32!和33!出于相同的原因,它们的值相同 34!为 0(至少对于 int 数据类型):它溢出,只是以“有趣”的方式。如果你使用BigInteger,你可以试试:34!除以 2^32 余数为 0,而 32!和33!除以 2^32 时,只需共享相同的余数。
    【解决方案2】:

    你基本上是在计算 100!,大约是 9.3e+157,而一个长的最大值是 2^64 -1,所以大约是 1.8e+19。

    它不适合,这就是为什么你有 0。

    【讨论】:

    • 你的结论是错误的。如果一个值不适合 intlong,则它不会设置为 0。它会溢出。
    • 好吧,当我这样做时:int i = 429496729; i = i*100; System.out.println(i); 我得到 -60,而不是溢出。
    • 是的,你得到 -60 而不是 42949672900 因为int 溢出。这意味着最大整数 + 1 导致最小整数。但不是 0。
    • 实际上,是的,如果您长时间增加该值,您最终会得到 0。i = i*100*100*100*100*100*100*100*100*100*100*100*100*100*100000000; i 给了我 0。
    • 实际上你只能通过巧合得到 0。例如。在像Integer.MAX_VALUE + 1 + Integer.MIN_VALUE这样的情况下。
    【解决方案3】:

    你的数据类型太小了,即使你使用 long,所以你不能用基本类型做这个计算。所以你会得到一个溢出,值变成负数,在某个点为 0。因此,每次循环后结果仍然为零。

    您可以通过在循环中打印currentSolution 来查看。

    为了得到正确的解决方案,请尝试使用BigInteger

    public static void calculate() {
        BigInteger currentSolution = BigInteger.valueOf(1);
        for (int i = 1; i < 100; i++) {
            currentSolution = currentSolution.multiply(BigInteger.valueOf(i));
        }
        System.out.println(currentSolution);
    }
    

    这输出了正确的解决方案:

    【讨论】:

    • 锦上添花,你可以提到这个很长的数模 4294967296 为零,这说明了 OP 得到的结果。
    【解决方案4】:

    您的 for 循环计算 100 的阶乘,即 1 * 2 * 3 * ... * 99 * 100,也写为 100!等于 9.332621544×10157

    int 的范围是 -2,147,483,648 到 2,147,483,647,long 的范围是 -9,223,372,036,854,775,808 到 9,223,372,036,854,775,807,所以对于 10157 的数字,您甚至在接近结束之前就已经遇到乘法溢出

    溢出最终导致所有位最终归零,从而产生结果 0。

    【讨论】:

      猜你喜欢
      • 2023-01-16
      • 1970-01-01
      • 2022-10-06
      • 2018-08-10
      • 1970-01-01
      • 2021-10-30
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多