罗马数字转换,也没啥难度,直接按规则写就行了
#include<stdio.h>
#include<string.h>
static int map[26];
static void print(int num)
{
int i, d = num / 1000;
for (i = 0; i < d; i++)
putchar('M');
d = (num / 100) % 10;
if (d == 9)
printf("%s", "CM");
else if (d == 4)
printf("%s", "CD");
else
{
if (d >= 5)
putchar('D');
for (i = 0; i < d % 5; i++)
putchar('C');
}
d = (num / 10) % 10;
if (d == 9)
printf("%s", "XC");
else if (d == 4)
printf("%s", "XL");
else
{
if (d >= 5)
putchar('L');
for (i = 0; i < d % 5; i++)
putchar('X');
}
d = num % 10;
if (d == 9)
printf("%s", "IX");
else if (d == 4)
printf("%s", "IV");
else
{
if (d >= 5)
putchar('V');
for (i = 0; i < d % 5; i++)
putchar('I');
}
}
static int number(char *s)
{
int i, res = 0;
for (i = 0; s[i] != '\0'; i++)
if ((s[i] == 'I' || s[i] == 'X' || s[i] == 'C')
&& map[s[i] - 'A'] < map[s[i + 1] - 'A'])
{
res += map[s[i + 1] - 'A'] - map[s[i] - 'A'];
i++;
}
else
res += map[s[i] - 'A'];
return res;
}
int main()
{
map['I' - 'A'] = 1;
map['V' - 'A'] = 5;
map['X' - 'A'] = 10;
map['L' - 'A'] = 50;
map['C' - 'A'] = 100;
map['D' - 'A'] = 500;
map['M' - 'A'] = 1000;
int n, i, count = 0;
char s[20];
while (scanf("%d", &n), n)
{
getchar();
int sum = 0;
for (i = 0; i < n; i++)
{
scanf("%s", s);
sum += number(s);
}
printf("Case ");
print(++count);
printf(": ");
print(sum);
putchar('\n');
}
return 0;
}