Ссылка на оригинальную статью.
Условие
Олимпиада началась в [latex]h_1[/latex] часов [latex]m_1[/latex] минут [latex]s_1[/latex] секунд, а закончилась в эти же календарные сутки в [latex]h_2[/latex] часов [latex]m_2[/latex] минут [latex]s_2[/latex] секунд. Сколько времени (час мин сек) проходила олимпиада?
Входные данные
В первой строке записано время начала, а во второй время окончания олимпиады в формате час мин сек.
[latex]0 \le h_1 \le h_2 \le 23[/latex], [latex]0 \le m_1, m_2 \le 59[/latex], [latex]0 \le s_1, s_2 \le 59[/latex].
Выходные данные
В единственную строку выходного файла нужно записать время продолжительности олимпиады в формате час мин сек.
Тестирование
№ | Входные данные | Выходные данные |
1 | 9 30 0
12 45 30 |
3 15 30 |
2 | 9 30 30
12 45 0 |
3 14 30 |
3 | 9 45 0
12 30 30 |
2 45 30 |
4 | 9 45 30
12 30 0 |
2 44 30 |
Код
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 |
package; import neko.Lib; import Std.int; class Main { static function main() { var h1:Int = Std.parseInt(Sys.stdin().readLine()); var m1:Int = Std.parseInt(Sys.stdin().readLine()); var s1:Int = Std.parseInt(Sys.stdin().readLine()); var h2:Int = Std.parseInt(Sys.stdin().readLine()); var m2:Int = Std.parseInt(Sys.stdin().readLine()); var s2:Int = Std.parseInt(Sys.stdin().readLine()); var d:Int ; d = 3600 * (h2 - h1) + 60 * (m2 - m1) + s2 - s1; trace(Math.round(d /3600)); trace(Math.floor((d/60) % 60)); trace(Math.round(d % 60)); } } |
Решение
Очевидным решением задачи является вывод через пропуск разниц [latex]h_2 — h_1[/latex], [latex]m_2 — m_1[/latex] и [latex]s_2 — s_1[/latex]. Однако если часы, минуты или секунды конца олимпиады будут меньше соответствующих значений ее начала, то результат разницы разницы будет отрицательным. Чтобы этого избежать, существуют два if-блока, которые увеличивают количество секунд на [latex]60[/latex] и уменьшают количество минут на [latex]1[/latex], а так же выполняют аналогичные действия с минутами и часами в том случае, если входное количество минут или секунд начала олимпиады будут превышать соответственно минуты и секунды конца. После этого выводятся разницы, указанные в начале решения, которые теперь будут отображать реальную продолжительность олимпиады и гарантированно будут неотрицательными.
- e-olymp 974. Флойд-1 - 13.06.2017
- e-olymp 1872. Снеговики - 13.06.2017
- A155 - 13.05.2017
— Всегда в подобных ситуациях переводите все в секунды, выполняйте действия и возвращайте обратно. Логика программы сильно упрощается и ненужно тестировать множество веток условных операторов. На это как бы намекает и категория задачи — линейные вычисления.
Вы не читали комментарии к «оригинальной статье».
— Забыли задать ключевые слова?
Исправил все ошибки.