07:08 pm - l < 12 + n/1000
Такова верхняя граница длины римского числа величиной n.
Например:
n=1 -> I -> l=1
n=2 -> II -> l=2
n=19 -> XIX -> l=3
Детали в Википедии.
Это нужно для рационального выделения памяти.
1 #include <stdlib.h>
2 #include <stdio.h>
3 #include <string.h>
4 #include <limits.h>
5
6
7 static const unsigned int ara[] = {1, 4, 5, 9, 10, 40, 50, 90, 100, 400, 500, 900, 1000};
8 static const char *rom[] = {"I","IV","V","IX","X","XL","L","XC","C","CD","D","CM","M"};
9
10 static char * arabic2roman(unsigned int n, char *c)
11 {
12 size_t i;
13 char *r;
14
15 if (NULL == c) return NULL;
16 r = c;
17
18 i = sizeof(ara) / sizeof(ara[0]) - 1;
19 while (n > 0) {
20 if (n >= ara[i]) {
21 strcpy(c, rom[i]);
22 c += strlen(rom[i]);
23 n -= ara[i];
24 }
25 else
26 i--;
27 }
28
29 *c = '\0';
30 return r;
31 }
32
33
34 int main (int argc, char * argv[])
35 {
36 int i;
37 int n;
38 int length_only = 0;
39 char s[12+INT_MAX/1000]; /* Max length of roman form for n: 12 + n/1000 */
40
41
42 for (i = 1; i < argc; i++) {
43 if (0 == strcmp(argv[i], "-l")) {
44 length_only = 1;
45 continue;
46 }
47
48 n = abs(atoi(argv[i]));
49 arabic2roman(n, s);
50 if (!length_only)
51 printf("%d %s\n", n, s);
52 else
53 printf("%d %d\n", n, strlen(s));
54 }
55 return EXIT_SUCCESS;
56 }
57