Вам не нужна 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));