e-olymp 2364. Часы

Костя Григорян
Костя Григорян

Latest posts by Костя Григорян (see all)

Задача

Ослик Иа-Иа и часы

Ослик Иа-Иа и часы

На очередной день рождения ослику Иа-Иа подарили наручные стрелочные часы. Теперь у него появилось новое развлечение — смотреть на бег стрелок. На то, как минутная догоняет часовую, обходит и тут же продолжает бежать за ней. Вот и в этот раз Кенга застала ослика за этим занятием. Она присоединилась к наблюдением и через некоторое время ей стало интересно, сколько уже моментов, когда минутная стрелка обгоняет часовую, видел Иа-Иа. Для этого она спросила у ослика во сколько он начал смотреть на часы, записала это и текущее время и побежала к Сове с этим вопросом. Но Сова оказалось очень занята и поэтому попросила вас помочь. Как известно, за один день часовая стрелка делает два оборота, а минутная целых [latex]24[/latex]. Continue reading

e-olymp 111. Часы

Часы.

Постановка задачи

Часы с боем пробивают каждый час такое количество ударов, сколько их есть на циферблате с цифрами от 1 до 12, и по одному разу тогда, когда минутная стрелка указывает на цифру 6. Зная начальное и конечное время в рамках одних календарных суток (выраженное в часах и минутах), подсчитать общее количество ударов на этом промежутке времени.

Алгоритм решения

Заведем переменную, которая будет отвечать за количество пробитых ударов. Если в начальное время минутная стрелка указывает на число 12, то увеличиваем значение нашей переменной на такое число, на которое указывает часовая стрелка, если же в начальное время минутная стрелка указывает на число 6, то увеличиваем значение переменной на 1. Увеличиваем начальное время на 1 минуту. Повторяем, пока начальное время не будет совпадать с конечным.

Тесты

Входные данные Выходные данные
Начальное время Конечное время Количество ударов
13:30 15:10 7
0:00 23:59 180
12:30 12:30 1
22:08 22:22 0

Реализация

ideone: ссылка
Засчитаное решение на e-olymp: ссылка

 

e-olymp 125. Олимпиада

Молоканов Юрий
Молоканов Юрий

Latest posts by Молоканов Юрий (see all)

Условие

Олимпиада началась в [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

Код

Решение

Очевидным решением задачи является вывод через пропуск разниц  [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;

Код программы на Ideone.com;

Подтверждение решения на E-Olymp.

А69

Оніщенко Олександр
Оніщенко Олександр

Latest posts by Оніщенко Олександр (see all)

Задача:   Часовая стрелка образует угол [latex]\varphi[/latex] с лучом, проходящим через центр  и через точку, соответствующую  [latex]12[/latex]  часам на циферблате, [latex] 0 < \varphi \leq 2\pi[/latex]. Определить значение угла для минутной стрелки, а также количество часов и полных минут.

Тесты

[latex]\varphi[/latex] Часы Минуты [latex]\alpha[/latex] Комментарий
30 1 0.00 0.00 Пройден
360 12 0.00 0.00 Пройден
1 0 2.00 12.00 Пройден
149.9 4 59.8 358.80 Пройден

Код

 

В условии задачи сказано, что [latex] 0 < \varphi \leq 2\pi[/latex], значит вводимое значение угла [latex]\varphi[/latex] — не может быть отрицательным  и  быть больше 360 градусов. Угол [latex]\alpha[/latex] — угол между минутной стрелкой и лучом. Один час — 30 градусов, что бы узнать количество часов нам следует  поделить введенный угол [latex]\varphi[/latex] на 30 градусов. Но перед этим   важно узнать остаток от этого деления, если такой имеется.  Если остаток равен 0, значит минутная стрелка показывает 0 минут и можно смело вывести значения  часов ( поделив [latex]\varphi[/latex] на 30),  минут и угла [latex]\alpha[/latex]( 0 ). Если  остаток все же не равен 0, нужно отнять его от [latex]\varphi[/latex]   и разделить на 30 градусов.  Так-как в одном часе 60 минут, а остаток не может быть больше 30 градусов, умножаем его на 2 и получаем количество минут. Подобную операцию проводим над углом [latex]\alpha[/latex], но в этот раз умножаем на 12. Выводим значения часов, минут и угла [latex]\alpha[/latex].

Ссылка на Ideone

Код для Java

Ссылка на Ideone

Ю1.4

Задача.

Временной интервал. Заданы моменты начала и конца некоторого промежутка времени в часах, минутах и секундах (в пределах одних суток). Найти продолжительность этого промежутка в тех же единицах измерения.

Тесты

Момент начала промежутка Момент конца промежутка Ответ
Часы Минуты Секунды Часы Минуты Секунды Часы Минуты Секунды
ch min sek ch1 min1 sek1 chh  minn sekk
3 24 30 10 44 35 7 20 5
2 11 20 10 21 10 8 9 50
2 10 31 10 10 44 8 0 13
2 11 30 10 6 20 7 54 50
2 11 20 10 6 30 7 55 10
3 4 4 3 4 4 Не прошло ни секунды с начала отсчета
0 30 11 0 44 15 0 14 4
0 11 70 0 15 80 Неправильно введены данные
0 0 30 0 0 55 0 0 25

 Код программы на C++:

В данной задаче я отнимал от конечного момента времени (часов, минут, секунд) начальный момент времени (часы, минуты, секунды) и получал результат. Особое внимание я уделил частным случаям. Здесь есть несколько основных условий при который обычного вычитания не достаточно, а требуются особые вычисление (т.к. в часах 60 минут, а в минутах 60 секунд).
Я разберу частный случай, при котором минуты и секунды конечного момента времени меньше минут и секунд начального момента времени.  Вот конкретная строка из кода, отвечающая за этот случай:
Разберем на конкретном примере. Начальный момент времени равен 2 часа 11 минут 30 секунд, а конечный — 10 часов 6 минут 20 секунд. (Строка 4 таблицы значений). Отнимая, 10-2=8, 6-11=-5, 20-30=-10, выходим за область значений и минуты с секундами получаются отрицательными. Для того, чтобы этого не случилось следует один час перевести в минуты и одну минуту перевести в секунды, то есть, соответственно, отнять единичку от конечных значений часов и минут. Получаем 9 часов 65 минут и 80 секунд. Это значение высчитывается в программе и является промежуточным вычислением, которое не выводится на экран, но участвует в расчетах. Отнимая, 9-2=7 , 65-11=54 , 80-30=50  , что уже и является результатом (7 часов 54 минуты 50 секунд). 
Остальные частные случаи вычисляются по такому же принципу (перевод одного часа в минуты / одной минуты в секунды).
Например, когда минуты начального момента времени и конечного момента времени будут равны, а секунды конечного момента времени меньше начального, то в ответе всегда получится 59 минут. (т.к. разность минут равна нулю, а одна минута нам нужна для того, чтобы оставить секунды в области допустимых значений, а 0 минут то же самое, что и 60 минут, а 60-1=59).
Второй вариант решения этой задачи выглядит намного проще. С теми же самыми тестами.

Код программы на C++:

Алгоритм:

  1. Переводим всё в наименьшие единицы измерения (в секунды). [latex]ch*=3600 [/latex], [latex]min*=60[/latex],[latex]ch1*=3600 [/latex], [latex]min1*=60[/latex]
  2. Находим начальное значение в секундах: [latex]beg=ch+min+sek [/latex], конечное значение в секундах [latex]end=ch1+min1+sek1[/latex].
  3. Находим разность между начальным и конечным значением, тем самым находим промежуток. [latex]dif=end-beg[/latex].
  4. Вычисляем значения часов,  минут и секунд промежутка по формулам: [latex]chh = \frac{dif}{3600}[/latex], [latex]minn = \frac{dif — 3600 * chh}{60}[/latex], [latex]sekk = dif — 3600 * chh — minn * 60[/latex].

Либо еще один вариант решения при помощи операций деления и остатка от деления.

Код программы на C++:

Алгоритм тот же кроме последнего пункта, где формулы становятся такими:
chh = dif / 3600,
minn = dif  % 3600 / 60,
sekk = dif  % 60.

Код программы на Java

И второе решение:

Код программы на Java

Код решения на Java