514. Время для Николая

 

Васильку известно, что святой Николай начинает развозить подарки, когда стемнеет, а заканчивает – когда светает. Ему интересно: сколько времени будет у Николая для того, чтобы раздать всем подарки.

 

Вход. В единственной строке заданы t1 и t2 – время, когда Николай начинает и когда заканчивает развозить подарки, в формате hh : mm : ss.

 

Выход. Вывести время, которое Николай использует для доставки подарков в формате hh : mm : ss. Гарантируется, что это время не превышает 12 часов.

 

Пример входа

Пример выхода

19:00:00 21:00:00

02:00:00

 

 

РЕШЕНИЕ

элементарная задача

 

Анализ алгоритма

Преобразуем начальное и конечное время в секунды. Времени hh : mm : ss соответствует 3600 * hh + 60 * mm + ss секунд.

Вычислим разницу t2t1 между ними. Если она отрицательная, то полночь принадлежит времени, когда Николай развозит подарки. В таком случае к отрицательной разнице следует прибавить 3600 * 24 – количество секунд в сутках. Далее вычисляем сколько часов, минут и секунд составляет найденная разница.

Пусть d – время развозки подарков в секундах. Преобразование его в часы h, минуты m и секунды s аналогично представлению числа d в шестидесятиричной системе счисления:

·        h = d / 3600;

·        m = (d % 3600) / 60;

·        s = d % 60;

Для d = 18886 имеем:

·        h = 18886 / 3600 = 5;

·        m = (18886 % 3600) / 60 = 14;

·        s = 18886 % 60 = 46;

 

Реализация алгоритма

Читаем входные данные. Преобразуем начальное и конечное время в секунды.

 

scanf("%d:%d:%d %d:%d:%d",&h1,&m1,&s1,&h2,&m2,&s2);

t1 = h1 * 3600 + m1 * 60 + s1;

t2 = h2 * 3600 + m2 * 60 + s2;

 

Вычисляем разницу времен t2 и t1 в секундах. Если t2 < t1, то время t2 принадлежит следующим суткам.

 

d = t2 - t1;

if (d < 0) d += 3600*24;

// d = (t2 - t1 + 3600*24) % (3600*24);

 

Преобразуем разницу d в часы h3, минуты m3 и секунды s3.

 

h3 = d / 3600;

m3 = (d % 3600) / 60;

s3 = d % 60;

 

Выводим ответ в формате времени. Формат %02d означает вывод целого двузначного числа. Причем если число является однозначным, то перед ним выводится 0. Например, если количество минут равно 4, то выведется 04. Если количество минут равно 0, то выведется 00.

 

printf("%02d:%02d:%02d\n",h3,m3,s3);

 

Java реализация

 

import java.util.*;

 

public class Main

{

  public static void main(String[] args)

  {

    Scanner con = new Scanner(System.in);

    String s = con.next();

    StringTokenizer st1 = new StringTokenizer(s, ":");

    int h1 = Integer.parseInt(st1.nextToken());

    int m1 = Integer.parseInt(st1.nextToken());

    int s1 = Integer.parseInt(st1.nextToken());

 

    s = con.next();

    st1 = new StringTokenizer(s, ":");

    int h2 = Integer.parseInt(st1.nextToken());

    int m2 = Integer.parseInt(st1.nextToken());

    int s2 = Integer.parseInt(st1.nextToken());

 

    int t1 = h1 * 3600 + m1 * 60 + s1;

    int t2 = h2 * 3600 + m2 * 60 + s2;

   

    int d = (t2 - t1 + 3600*24) % (3600*24);

   

    int h3 = d / 3600; d = d % 3600;

    int m3 = d / 60;

    int s3 = d % 60;

    System.out.printf("%02d:%02d:%02d\n",h3,m3,s3);

    con.close();

  }

}