如何用 Java 语言计算整数 m 使得 m^3 <= Long.MAX_VALUE < (m + 1)^3?

How to compute the integer m such that m^3 <= Long.MAX_VALUE < (m + 1)^3 by Java language?

我想知道 long m 这样 m*m*m <= Long.MAX_VALUE && Long.MAX_VALUE < (m + 1)*(m + 1)*(m + 1)

如何计算上述 long m

我很担心溢出,我完全不知道溢出

你不需要 Java 来解决这个问题。

Long.MAX_VALUE == (2^63)-1。如果 n == 2^(63/3) = 2^21,则 n*n*n = 2^63。因此,(m+1) == 2^21,因此 m == (2^21)-1

如果你想写一些代码让自己相信这一点:

    long m = (1L << 21) - 1;
    System.out.println(m*m*m);                  // 9223358842721533951
    System.out.println(m*m*m < Long.MAX_VALUE); // true

    long n = m + 1;
    System.out.println(n*n*n);                  // -9223372036854775808

所以n*n*n明显溢出了,因为它的值为负数

(请注意,如果结果为正,甚至大于 m*m*m,这并不能证明它 没有 溢出。这只是巧合溢出是如此明显)。

您也可以使用 Long.compareUnsigned:

// Negative, so m*m*m < Long.MAX_VALUE)
System.out.println(Long.compareUnsigned(m*m*m, Long.MAX_VALUE));

// Positive, so unsigned n*n*n > Long.MAX_VALUE)
System.out.println(Long.compareUnsigned(n*n*n, Long.MAX_VALUE));

非常感谢c0der。

我可以使用Math.cbrt()函数来得到答案。
我可以通过安迪特纳的方法检查答案是否正确。

long m1 = (long) Math.cbrt((double) Long.MAX_VALUE); System.out.println(m1*m1*m1); m1++; System.out.println(m1*m1*m1);

这样可以吗?

long i = 0, j = 1;
while (i*i*i < j*j*j) {
    i++;
    j++;
}
Sytem.out.println(i);