Temperatures

Температуры

Задача взята с сайта codingame.com

Задача.

Задан набор целых чисел (значения температуры за различные моменты времени). Нужно вывести из них ближайшее к нулю.

Входные данные.

Задан набор целых чисел (значения температуры за различные моменты времени). Нужно вывести из них ближайшее к нулю.

Выходные данные.

Вывести нуль, если  [latex] N = 0[/latex]. В противном случае вывести число, ближайшее к нулю, причём если два числа разных знаков одинаково близки к нулю, нужно вывести положительное.

Решение.

Сначала отфильтруем случай, когда  [latex] N = 0[/latex]. В этом случае, как от нас и требуют, напечатаем нуль.

Если же  [latex] N > 0 [/latex], прибегнем к уже знакомому нам приёму. Введём новую переменную — min — и присвоим ей первое число. Затем в цикле for будем эту переменную менять, если наткнёмся число, более близкое к нулю, чем хранящееся в min. Вот основной вопрос: когда нам нужно менять min? «Число  [latex] a [/latex]  ближе к нулю, чем число  [latex] b [/latex]»  означает, что  [latex] a [/latex] по модулю меньше, чем   [latex] b [/latex]. Значит, если число, прочитанное на текущем шаге цикла, по модулю строго меньше, чем число, хранящееся в min, переменную min нужно обновить. Но есть ещё один случай, когда переменную min следует обновить — это тот случай, когда текущее число положительно и столь же близко к нулю, как и число, хранящееся в min. Это действие даёт нам гарантию того, что если два числа разных знаков одинаково близки к нулю, будет выведено положительное.

Код на С++

Код на Java

 

P.S.. Возможно, усложнив оператор ветвления можно сделать алгоритм более эффективным за счёт уменьшения числа сравнений или присваиваний.

4 thoughts on “Temperatures

  1. — Нужна ссылка откуда взялась задача.
    — В условии (abs(temp) < abs(min)) || (temp == abs(min)) второй дизъюнкт лишний. Или требуется указать последнее из нескольких одинаковых по модулю значений? - Уберите, пожалуйста, лишние пустые строки в описании. - Рисунок лучше сделать с обтеканием текстом - Когда черновик будет не нужен, удалите его, пожалуйста.

    • Замечания учтены.
      ***
      Без второго условия может не выполняться требование «если два числа разных знаков одинаково близки к нулю, нужно вывести положительное». Нам нужно как-то избежать, например, ситуации (-2, 2), когда -2 запомнилось, 2 по модулю не строго меньше и программа возвратит -2, хотя должна 2.

    • Условие temp == abs(min) я ввёл на тот случай, если min хранит отрицательное значение. Если мы в цикле встречаем положительное, равноудалённое с отрицательным, то, благодаря этому условию, min будет хранить именно его.

Добавить комментарий