Если есть int j = Integer.MAX_VALUE
и int k = Integer.MAX_VALUE
, как я могу вычислить среднее значение (j + k)/2, так что result = Integer.MAX_VALUE
без возникновения переполнения ,Взяв среднее число целых чисел (j + k)/2, когда в стеке есть переполнение
ответ
В этом случае (j+k)/2
такое же, как (j/2) + (k/2)
коррекции в соответствии с bilalba
int j = Integer.MAX_VALUE;
int k = Integer.MAX_VALUE;
int res = (j/2) + (k/2) + (j%2 & k%2);
System.out.println(res);
(j/2) + (k/2) + ((j%2) && (k%2))
((J% 2) & & (к% 2)), чтобы удовлетворить для случая с нечетными числами. Если у, к = 1, то J/2 + к/2 только даст вам 0.
Это потому, что 0,5 будет сражен к следующему наименьшее целое число, которое равно 0.
Спасибо за исправление, но ваш код не компилируется. См. Мой ответ. –
Как именно вы закодировали бы эту @bilalba. Я думаю, что понимаю, что вы пытаетесь сказать, но я не совсем уверен, что вы подразумеваете под '+ (j% 2 && k% 2)', потому что, как говорит @Scary Wombat, код не компилируется – Kekis2014
@ Kekis2014 Я исправил свой ответ, правильный код должен быть '(j/2) + (k/2) + (j% 2 & k%2);' Это только один '&' –
Вы могли бы написать, (j/2) + (k/2)
, Вот пример для двух небольших чисел 10
и 11
, используя типичный метод.
10 + 11 = 21
21/2 = 10.5
Теперь другой способ:
10/2 = 5;
11/2 = 5.5;
5.5+5 = 10.5;
Как вы можете видеть здесь, в любом случае вы получите тот же результат, за исключением того, что вам не придется добавить число, потому что это приведет к переполнению как вы упомянули.
EDIT
Я просто понял, что это неправильно, и будет работать только с четными номерами. Вот оптимальное решение (работает для всех номеров).
(j/2) + (k/2) + (j%2 && k%2);
j + (i - j)/2
эквивалентно (i + j)/2
и не будет переполнения в этом случае (когда разность между числами мала). В случаях, когда это выражение переполняется, (i + j)/2
не будет.
такие же как (j/2) + (k/2) –
@ScaryWombat вы можете разместить это как ответ вместо комментариев, чтобы я мог отметить его как правильный ответ? Благодаря! – Kekis2014
Не лучше ли использовать длинные, если вы достигнете Integer.MAX_VALUE? – Gendarme