Как вычислить такое целое число m, что m ^ 3 <= Long.MAX_VALUE <(m + 1) ^ 3 на языке Java? - PullRequest
0 голосов
/ 27 июня 2019

Я хочу знать long m такой, что m*m*m <= Long.MAX_VALUE && Long.MAX_VALUE < (m + 1)*(m + 1)*(m + 1).

Как я могу вычислить выше long m?

Я беспокоюсь о переполнении и вообще не знаю о переполнении.

Ответы [ 3 ]

4 голосов
/ 27 июня 2019

Вам не нужна 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));
0 голосов
/ 28 июня 2019

Это нормально?

long i = 0, j = 1;
while (i*i*i < j*j*j) {
    i++;
    j++;
}
Sytem.out.println(i);
0 голосов
/ 27 июня 2019

Большое спасибо, 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);

...