2016-08-30 3 views
1

Если есть int j = Integer.MAX_VALUE и int k = Integer.MAX_VALUE, как я могу вычислить среднее значение (j + k)/2, так что result = Integer.MAX_VALUE без возникновения переполнения ,Взяв среднее число целых чисел (j + k)/2, когда в стеке есть переполнение

+0

такие же как (j/2) + (k/2) –

+0

@ScaryWombat вы можете разместить это как ответ вместо комментариев, чтобы я мог отметить его как правильный ответ? Благодаря! – Kekis2014

+0

Не лучше ли использовать длинные, если вы достигнете Integer.MAX_VALUE? – Gendarme

ответ

3

В этом случае (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); 
+1

Это на самом деле даст неправильный ответ. Он даст Integer.MAX_VALUE-1. – bilalba

+0

Вы правы @bilalba. Это решение работает в большинстве случаев, но не для этого случая. – Kekis2014

+1

Обновление: теперь обновленное решение работает – Kekis2014

0
(j/2) + (k/2) + ((j%2) && (k%2)) 

((J% 2) & & (к% 2)), чтобы удовлетворить для случая с нечетными числами. Если у, к = 1, то J/2 + к/2 только даст вам 0.

Это потому, что 0,5 будет сражен к следующему наименьшее целое число, которое равно 0.

+0

Спасибо за исправление, но ваш код не компилируется. См. Мой ответ. –

+0

Как именно вы закодировали бы эту @bilalba. Я думаю, что понимаю, что вы пытаетесь сказать, но я не совсем уверен, что вы подразумеваете под '+ (j% 2 && k% 2)', потому что, как говорит @Scary Wombat, код не компилируется – Kekis2014

+2

@ Kekis2014 Я исправил свой ответ, правильный код должен быть '(j/2) + (k/2) + (j% 2 & k%2);' Это только один '&' –

1

Вы могли бы написать, (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); 
1

j + (i - j)/2 эквивалентно (i + j)/2 и не будет переполнения в этом случае (когда разность между числами мала). В случаях, когда это выражение переполняется, (i + j)/2 не будет.

 Смежные вопросы

  • Нет связанных вопросов^_^