Постановка задачи
Часы с боем пробивают каждый час такое количество ударов, сколько их есть на циферблате с цифрами от 1 до 12, и по одному разу тогда, когда минутная стрелка указывает на цифру 6. Зная начальное и конечное время в рамках одних календарных суток (выраженное в часах и минутах), подсчитать общее количество ударов на этом промежутке времени.
Входные данные:
Начальное и конечное время одних календарных суток в часах [latex](H)[/latex] и минутах [latex](M)[/latex] через пробел [latex](0 \leq H \leq 23, 0 \leq M \leq 59)[/latex].
Выходные данные:
Ответ на задачу — общее количество ударов.
Тесты
№ | Входные данные | Выходные данные | |
Начальное время | Конечное время | ||
1 | 00 00 | 02 35 | 18 |
2 | 17 23 | 22 29 | 45 |
3 | 16 57 | 16 57 | 0 |
4 | 00 00 | 23 59 | 180 |
Решение
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 |
import java.util.*; class Main { public static void main (String[] args) { int m1,m2,h1,h2, rings = 0; Scanner in = new Scanner(System.in); h1 = in.nextInt(); m1 = in.nextInt(); h2 = in.nextInt(); m2 = in.nextInt(); in.close(); while (true) { if (m1 == 0) rings += (h1==0 || h1==12)?12:h1%12; if (m1 == 30) rings += 1; if (m1 == m2 && h1 == h2) break; m1 ++ ; if (m1 > 60) { m1 = 0; h1 ++ ; } } System.out.println(rings); } } |
Описание решения
Будем для простоты и удобства использовать бесконечный цикл, который будет прерван из тела цикла при совпадении текущего времени с конечным. Текущим временем считается начальное время, которое будет увеличиваться на 1 минуту с каждым шагом цикла, так как по условию задачи действие происходит в рамках одних календарных суток.
Действия внутри цикла следует выполнять в следующем порядке:
- Увеличение количества ударов на 1 или на ту цифру (число), на которую указывает часовая стрелка
- Проверка равенства текущего времени и конечного.
- Увеличение времени на 1 минуту (переход на следующий час если текущая минута прошла отметку 59)
Такой порядок не позволит пропустить условие прерывания цикла или удара часов в различных случаях (например, начальное и конечное время равны, начальная минута равна 0 или 30).
В итоге к переменной rings будет прибавляться 1 каждый раз, когда минутная стрелка достигает 30 и число, на которое указывает часовая стрелка, каждый раз, когда минутная стрелка достигает 0 (находим остаток от деления количества часов на 12 за исключением тех случаев, когда часы показывают 12 или 0 часов rings += (h1==0 || h1==12)?12:h1%12;).
Посмотреть решение задания можно на сайте e-olymp.
Посмотреть, как работает программа со входными данными 00 00 23 59 можно на сайте ideone.