Задача
В электронных часах произошел сбой, и теперь каждую секунду увеличивается не счетчик секунд, а счетчик часов. При переполнении счетчика часов (то есть при достижении [latex]24[/latex]) он сбрасывается в [latex]0[/latex] и увеличивается счетчик минут. Аналогично, при переполнении счетчика минут происходит его сброс и увеличивается счетчик секунд. При переполнении счетчика секунд он также сбрасывается в [latex]0[/latex], а остальные счетчики так и остаются равными [latex]0[/latex]. Известно, что сбой произошел в [latex]h_1[/latex] часов [latex]m_1[/latex] минут [latex]s_1[/latex] секунд. В этот момент часы показывали правильное время.
Напишите программу, определяющую по показаниям сломанных часов правильное время.
Входные данные
В первой строке задаются три целых числа [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,\;h_2\;\lt\;24[/latex], [latex]0\;\le m_1,\;m_2,\;s_1,\;s_2\;\lt\;60[/latex] ).
Выходные данные
В единственной строке выведите правильное время (т.е. число часов, минут и секунд) в момент, когда сломанные часы будут показывать [latex]h_2[/latex] часов [latex]m_2[/latex] минут [latex]s_2[/latex] секунд.
Тесты
Входные данные | Выходные данные |
---|---|
[latex]12 \; 0 \; 0\\12 \; 1 \; 0[/latex] | [latex]12 \; 0 \; 24[/latex] |
[latex]13 \; 59 \; 59\\12 \; 59 \; 59[/latex] | [latex]13 \; 59 \; 58[/latex] |
[latex]15 \; 12 \; 16\\15 \; 12 \; 16[/latex] | [latex]15 \; 12 \; 16[/latex] |
[latex]\;0 \;\;\; 0 \;\;\; 0\\23 \; 59 \; 59[/latex] | [latex]23 \; 59 \; 59[/latex] |
[latex]16 \; 0 \; 17\\16 \; 0 \; 18[/latex] | [latex]16 \; 24 \;17[/latex] |
[latex]11 \;\; 0 \;\; 53\\0 \;\;\; 0 \;\;\; 0[/latex] | [latex]13 \; 48 \; 42[/latex] |
[latex]1 \;\; 13 \; 18\\22 \; 51 \; 32[/latex] | [latex]7 \;\;\; 4 \;\;\; 51[/latex] |
Код программы
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 |
#include <iostream> using namespace std; int main() { int h1, m1, s1, h2, m2, s2; int sum1, sum2, sec, time1, time2; int h3, m3, s3; cin >> h1 >> m1 >> s1 >> h2 >> m2 >> s2; 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; cout << h3 << " " << m3 << " " << s3; return 0; } |
Решение
Учитывая особенности хода сломанных часов, подсчитаем количество секунд в начальный и конечный моменты времени ( sum1 и sum2). Вычислим, сколько секунд прошло с момента поломки часов — для этого найдём разность sum2 - sum1, прибавим [latex]86400[/latex] — количество секунд в сутках (поскольку мог произойти переход через момент времени [latex]0 \; : \; 0 \; : \; 0[/latex]) и найдём остаток от деления полученной суммы на [latex]86400[/latex].
Теперь найдём количество секунд, прошедших с начала суток, в которых поломались часы ( time1). Прибавим к нему количество секунд, прошедших с момента поломки часов и найдём остаток от деления на [latex]86400[/latex] полученного числа. Имеем time2 — правильное время в секундах. Далее, находим значения счётчиков часов [latex]h_3[/latex], минут [latex]m_3[/latex] и секунд [latex]s_3[/latex] которые соответствуют моменту времени time2.
Ссылки
Условия задачи на e-olymp
Код задачи на ideone