Дополнительные секунды Имя входного файла: input.txt
Имя выходного файла: output.txt
Ограничение по времени: 1 секунда
Ограничение по памяти: 256 мегабайт
Вы, наверное, замечали, что часы могут спешить или отставать, из-за чего координировать
действия становится сложно. В наше время такая проблема встаёт всё реже — на электронных
устройствах с доступом в интернет можно просто синхронизировать время.
Существует несколько стандартов времени, но основными являются UT1 и UTC. Универсальное
время (UT1) зависит от солнечного времени на нулевой долготе и является максимально точным.
Но используется везде Всемирное координированное время (UTC) — приближённое значение UT1
к шкале атомных часов.
Иногда добавляются дополнительные секунды так, чтобы UTC отличалось от UT1 на не более
чем на ±0.9 секунды.
В данное время о добавлении секунд специально сообщает Международная служба вращения
Земли 30-го июня или 31-го декабря, но в будущем может потребоваться добавлять секунды чаще,
а также может понадобиться их отнимать.
Вы считаете разницу во времени между годами [si
, fi), и хотели бы дать наиболее точный результат. Вы уже учли всё-всё-всё, осталось лишь узнать, на сколько секунд надо скорректировать
результат.
Формат входных данных
В первой строке входного файла содержится два целых числа N и Q — количество известных
вам лет, когда были добавлены или вычтены дополнительные секунды, и количество запросов соответственно (1 6 N 6 106
, 1 6 Q 6 105
).
В следующих N строках записаны пары целых чисел yi и ni — год и количество дополнительных
секунд (−109 6 yi
, ni 6 109
). Если ni < 0, то эти секунды вычитались, иначе — добавлялись.
В следующих Q строках записаны запросы, которые задаются парами чисел si и fi — двумя
годами, между которыми требуется посчитать временной интервал (−109 6 si
, fi 6 109
).
Формат выходных данных
Выходной файл должен содержать Q строк, на каждой из которой должно быть одно число —
количество секунд, на которое нужно скорректировать ваши расчёты для соответствующего запроса.
#include <stdio.h>
#include <stdlib.h>
int main()
{
int year, century;
// { "I", "IV", "V", "IX", "X", "XL", "L", "XC", "C", "CD", "D", "CM", "M" };
short ArrRom[] = { 73, 18774, 86, 18776, 88, 22604, 76, 22595, 67, 17220, 68, 17229, 77 };
int ArrRom2[] = { 1, 4, 5, 9, 10, 40, 50, 90, 100, 400, 500, 900, 1000, 5000};
/*Т.к тип char в себе содержит только 1 байт,а нам местами желательно хранить 2 символа (4 римскими цифрами - IV),
поэтому используем тип short и помещаем в него десятичные представления наших символов, если с одинарными символами
все просто, то с двойными делаем такую схему: ASCII код символа I в десятичной системе счисления = 73, далее мы
переводим в двойчную систему счисления 01001001 тоже самое делаем с символом V = 86 = 01010110, теперь совмещаем
0100100101010110 и переводим данное число в десятный формат = 18774. И того код символа I попадаем в старший
байт, а код символа V в младший.**
*/
printf("Enter the year\n");
while (scanf_s("%d", &year) != 1 || year>399900)
{
printf("Invalid format\n");
system("pause");
return 0;
}
if (year % 100 == 0)
{
century = year / 100;
}
else
{
century = year / 100 + 1;
}
printf("%d year refer to ", year);
for (int i = 0;century != 0; ++i) //Условие конца цикла когда век будет равен 0
{
int j=0;
for (; century >= ArrRom2[j]; ++j);// В этом цикле введенный нами век сравнивается с массивом содержащим цифры.
//Если век больше текущего элемента массива, то сравниваем со следующим. Условие конца цикла - век больше очередного
//элемента массива.*
printf("%c",ArrRom[j - 1] >> 8); //**т.к. в оджном элементе массива закодировано 2 символа, чтобы достать первый,
//мы сдвигаем значение на 8 бит вправо. Например, число 0100100101010110 в двоичной системе сдвигаем на 8 бит вправо
//получаем 0000000001001001. При печати будет выглядеть как I.
printf("%c", ArrRom[j - 1] << 8 >> 8); //здесь сначала сдвигаем на 8 бит влево, чтобы получить 0101011000000000,
//т.е. убрать младший байт. Затем сдвигаем обратно, чтобы убрать появившиеся нули в младшем байте. В итоге получаем
//0000000001010110. При печати будет выглядеть как V.
century -= ArrRom2[j - 1];//*т.к при сравнении цикл останавливается на элементе большем, чем нам нужен, то мы
//вычитаем 1 из итератора чтобы получить нужный нам эллемент,затем мы вычитаем его из века.
}
printf(" century \n");
system("pause");
return 0;
}
Объяснение:
#include <stdio.h>
#include <stdlib.h>
int main()
{
int year, century;
// { "I", "IV", "V", "IX", "X", "XL", "L", "XC", "C", "CD", "D", "CM", "M" };
short ArrRom[] = { 73, 18774, 86, 18776, 88, 22604, 76, 22595, 67, 17220, 68, 17229, 77 };
int ArrRom2[] = { 1, 4, 5, 9, 10, 40, 50, 90, 100, 400, 500, 900, 1000, 5000};
/*Т.к тип char в себе содержит только 1 байт,а нам местами желательно хранить 2 символа (4 римскими цифрами - IV),
поэтому используем тип short и помещаем в него десятичные представления наших символов, если с одинарными символами
все просто, то с двойными делаем такую схему: ASCII код символа I в десятичной системе счисления = 73, далее мы
переводим в двойчную систему счисления 01001001 тоже самое делаем с символом V = 86 = 01010110, теперь совмещаем
0100100101010110 и переводим данное число в десятный формат = 18774. И того код символа I попадаем в старший
байт, а код символа V в младший.**
*/
printf("Enter the year\n");
while (scanf_s("%d", &year) != 1 || year>399900)
{
printf("Invalid format\n");
system("pause");
return 0;
}
if (year % 100 == 0)
{
century = year / 100;
}
else
{
century = year / 100 + 1;
}
printf("%d year refer to ", year);
for (int i = 0;century != 0; ++i) //Условие конца цикла когда век будет равен 0
{
int j=0;
for (; century >= ArrRom2[j]; ++j);// В этом цикле введенный нами век сравнивается с массивом содержащим цифры.
//Если век больше текущего элемента массива, то сравниваем со следующим. Условие конца цикла - век больше очередного
//элемента массива.*
printf("%c",ArrRom[j - 1] >> 8); //**т.к. в оджном элементе массива закодировано 2 символа, чтобы достать первый,
//мы сдвигаем значение на 8 бит вправо. Например, число 0100100101010110 в двоичной системе сдвигаем на 8 бит вправо
//получаем 0000000001001001. При печати будет выглядеть как I.
printf("%c", ArrRom[j - 1] << 8 >> 8); //здесь сначала сдвигаем на 8 бит влево, чтобы получить 0101011000000000,
//т.е. убрать младший байт. Затем сдвигаем обратно, чтобы убрать появившиеся нули в младшем байте. В итоге получаем
//0000000001010110. При печати будет выглядеть как V.
century -= ArrRom2[j - 1];//*т.к при сравнении цикл останавливается на элементе большем, чем нам нужен, то мы
//вычитаем 1 из итератора чтобы получить нужный нам эллемент,затем мы вычитаем его из века.
}
printf(" century \n");
system("pause");
return 0;
}
Объяснение: