Tag Archives: часы
e-olymp 1474. Сломанные часы
Задача
В электронных часах произошел сбой, и теперь каждую секунду увеличивается не счетчик секунд, а счетчик часов. При переполнении счетчика часов (то есть при достижении $24$) он сбрасывается в $0$ и увеличивается счетчик минут. Аналогично, при переполнении счетчика минут происходит его сброс и увеличивается счетчик секунд. При переполнении счетчика секунд он также сбрасывается в $0$, а остальные счетчики так и остаются равными $0$. Известно, что сбой произошел в $h_1$ часов $m_1$ минут $s_1$ секунд. В этот момент часы показывали правильное время.
Напишите программу, определяющую по показаниям сломанных часов правильное время.
Входные данные
В первой строке задаются три целых числа $h_1$, $m_1$, $s_1$, определяющие время поломки часов. Во второй строке записаны три числа $h_2$, $m_2$, $s_2$, которые определяют показания часов в текущий момент времени ( $0\;\le\;h_1,\;h_2\;\lt\;24$, $0\;\le m_1,\;m_2,\;s_1,\;s_2\;\lt\;60$ ).
Выходные данные
В единственной строке выведите правильное время (т.е. число часов, минут и секунд) в момент, когда сломанные часы будут показывать $h_2$ часов $m_2$ минут $s_2$ секунд.
Тесты
Входные данные | Выходные данные |
---|---|
$12\;0\;0$ $12\;1\;0$ |
$12\;0\;24$ |
$13\;59\;59$ $12\;59\;59$ |
$13\;59\;58$ |
$15\;12\;16$ $15\;12\;16$ |
$15\;12\;16$ |
$0\;0\;0$ $23\;59\;59$ |
$23\;59\;59$ |
$16\;0\;17$ $16\;0\;18$ |
$16\;24\;17$ |
$11\;0\;53$ $0\;0\;0$ |
$13\;48\;42$ |
$1\;13\;18$ $22\;51\;32$ |
$7\;4\;51$ |
Код программы
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 |
import java.util.Scanner; public class Main { public static void main(String[] args) { Scanner sc = new Scanner(System.in); int h1, m1, s1, h2, m2, s2; int sum1, sum2, sec, time1, time2; int h3, m3, s3; h1 = sc.nextInt(); m1 = sc.nextInt(); s1 = sc.nextInt(); h2 = sc.nextInt(); m2 = sc.nextInt(); s2 = sc.nextInt(); sum1 = h1 + m1 * 24 + s1 * 24 * 60; sum2 = h2 + m2 * 24 + s2 * 24 * 60; sec = (sum2 - sum1 + 86400) % 86400; time1 = 3600 * h1 + 60 * m1 + s1; time2 = (time1 + sec) % 86400; s3 = time2 % 60; m3 = ((time2 - s3) / 60) % 60; h3 = (time2 - m3 * 60 - s3) / 3600; System.out.print(h3 + " " + m3 + " " + s3); } } |
Решение
Учитывая особенности хода сломанных часов, подсчитаем количество секунд в начальный и конечный моменты времени ( sum1 и sum2 ). Вычислим, сколько секунд прошло с момента поломки часов — для этого найдём разность sum2 - sum1 , прибавим $86400$ — количество секунд в сутках (поскольку мог произойти переход через момент времени $0\; : \;0\; : \;0$) и найдём остаток от деления полученной суммы на $86400$.
Теперь найдём количество секунд, прошедших с начала суток, в которых поломались часы ( time1 ). Прибавим к нему количество секунд, прошедших с момента поломки часов и найдём остаток от деления на $86400$ полученного числа. Имеем time2 — правильное время в секундах. Далее, находим значения счётчиков часов $h_3$, минут $m_3$ и секунд $s_3$ которые соответствуют моменту времени time2.
Ссылки
Условие задачи на e-olymp
Решение на ideone
Решение на e-olymp
e-olymp 111. Часы
Постановка задачи
Часы с боем пробивают каждый час такое количество ударов, сколько их есть на циферблате с цифрами от 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.