10683. Десятичные часы

 

Однажды математик Гильберт Ром изобрел часы с десятичной системой исчисления. День был поделен на 10 часов, в каждом часе было 100 минут, а в каждой минуте – 100 секунд. В задаче требуется перевести время из традиционной системы в десятичную с точностью до одной сотой секунды.

 

Вход. Состоит из нескольких строк. Каждая строка содержит традиционное время в формате HHMMSSCC, где 0 £ HH £ 23, 0 £ MM £ 59, 0 £ SS £ 59, 0 £ CC £ 99.

 

Выход. Для каждого теста вывести его соответствующее десятичное время в формате HMMSSCC, где 0 £ H £ 9, 0 £ MM £ 99, 0 £ SS £ 99, 0 £ CC £ 99. Значение десятичного времени следует округлить вниз.

 

Пример входа

00000000

23595999

12000000

14273467

02475901

 

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

0000000

9999998

5000000

6024846

1166552

 

 

РЕШЕНИЕ

математика

 

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

Вычислим, сколько миллисекунд в обыкновенной нотации приходится на одну миллисекунду в десятичной. Для этого следует поделить суммарное число миллисекунд в сутках в десятичной системе (оно равно 10 * 100 * 100 * 100) на число миллисекунд в обыкновенной (24 * 60 * 60 * 100). Далее следует вычислить число миллисекунд во входном традиционном  времени, умножить его на полученное выше соотношение и округлить до целого снизу. Полученное десятичное время следует выводить с ведущими нулями.

 

Пример

Соотношение между секундой в десятичной системе и секундой в обыкновенной системе равно 10 * 100 * 100 * 100 / 24 * 60 * 60 * 100 = 1.1574074. Для второго теста общее число миллисекунд равно 23 * 3600 * 100 + 59 * 60 * 100 + 59 * 100 + 99 = 8639999. Умножив его на выше полученное соотношение, получим 8639999 * 1.1574074 = 9999998,7785926. Округлив значение до целой части, получим 9999998. Это и есть соответствующее время в десятичной системе.

 

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

Объявим необходимые переменные. В переменной TotalMiliSeconds содержится количество миллисекунд в сутках при стандартной записи времени, в переменной TotalDecSeconds – при десятичной. Переменная rate содержит их отношение.

 

int h, m, s, c, MiliSeconds;

int TotalMiliSeconds = 24*3600*100;

int TotalDecSeconds = 10*10000*100;

int Res;

double rate = (double)TotalDecSeconds / TotalMiliSeconds;

 

Читаем количество часов h, минут m, секунд s и миллисекунд c, вычисляем общее количество миллисекунд MiliSeconds в текущем времени в стандартной нотации и умножаем полученное значение на rate. Округляем его, выделяя целое число, и печатаем в формате с обязательным выводом ведущих нулей (если таковы имеются). Всего выводится 7 цифр, поэтому формат вывода будет "%07d".

 

while (scanf("%2d%2d%2d%2d",&h,&m,&s,&c) == 4)

{

  MiliSeconds = h * 3600 * 100 + m * 60 * 100 + s * 100 + c;

  Res = int(rate * MiliSeconds);

  printf("%07d\n",Res);

}