По номеру некоторого года определить номер его столетия - C (СИ)
Формулировка задачи:
По номеру у(у>0) некоторого года определить с-номер его столетия(учесть, что, к примеру, началом ХХ столетия был 1901, а не 1900 год).
Решение задачи: «По номеру некоторого года определить номер его столетия»
textual
Листинг программы
#include <limits.h>
#include <stdio.h>
#include <string.h>
const int arabar[] = { 1, 4, 5, 9, 10, 40, 50, 90, 100, 400, 500, 900, 1000};
const char *romanar[] = { "I", "IV", "V", "IX", "X", "XL", "L", "XC", "C", "CD", "D", "CM", "M"};
char *arab2roman(unsigned short int arab) {
static char roman[80];
const int m = sizeof(arabar)/sizeof(int)-1, arabmax=arabar[m];
const char romanmax=romanar[m][0];
int i, n;
if (!arab) {
*roman=0;
return roman;
}
i = 0;
while(arab>arabmax) {
roman[i++] = romanmax;
arab -= arabmax;
}
n = m;
while(arab > 0) {
if (arab >= arabar[n]) {
roman[i++] = romanar[n][0];
if (n&1)
roman[i++] = romanar[n][1];
arab -= arabar[n];
} else
n--;
}
roman[i] = 0;
return roman;
}
unsigned short int year2century(unsigned short int y) {
return ((y%100) == 0) ? (y/100) : (y/100 + 1);
}
int main() {
int y;
printf("Введите год:");
scanf("%d", &y);
if (y > USHRT_MAX || y <= 0) {
printf("Ошибка");
return -1;
}
printf("Век: %s", arab2roman(year2century(y)));
return 0;
}
Объяснение кода листинга программы
- Объявлены две массивы: arabar[] и romanar[].
- В функции arab2roman() перебираются значения из массива arabar[] и для каждого значения, которое больше текущего значения переменной arab, добавляется соответствующая римская цифра в начало строки roman.
- Если значение арабской цифры больше максимального значения в массиве arabar[], то добавляется самая большая римская цифра (в данном случае это C или M) и от арабской цифры вычитается максимальное значение в массиве arabar[].
- В функции year2century() определяется, является ли год четным или нечетным, и в зависимости от этого определяется номер века.
- В функции main() пользователю предлагается ввести год, который затем проверяется на корректность (не меньше 1 и не больше 9999).
- Если год некорректен, то выводится сообщение об ошибке.
- В противном случае, вызывается функция year2century(), результат выводится на экран.