Игорь Пашев - Post a comment

Dec. 1st, 2010

[info]igorpashev

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

Альбом: Screenshots

Read Comments

Reply:

From:
(will be screened)
Identity URL: 
имя пользователя:    
Вы должны предварительно войти в LiveJournal.com
 
E-mail для ответов: 
Вы сможете оставлять комментарии, даже если не введете e-mail.
Но вы не сможете получать уведомления об ответах на ваши комментарии!
Внимание: на указанный адрес будет выслано подтверждение.
Username:
Password:
Subject:
No HTML allowed in subject
Message: