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.. Возможно, усложнив оператор ветвления можно сделать алгоритм более эффективным за счёт уменьшения числа сравнений или присваиваний.

Вустянюк Ігор Дмитрович
Вустянюк Ігор Дмитрович

Latest posts by Вустянюк Ігор Дмитрович (see all)

4 thoughts on “Temperatures

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

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

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

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