如何用 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);
我想知道 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);