古罗马帝国开创了辉煌的人类文明,但他们的数字表示法的确有些繁琐,尤其在表示大数的时候,现在看起来简直不能忍受,所以在现代很少使用了。之所以这样,不是因为发明表示法的人的智力的问题,而是
因为一个宗教的原因,当时的宗教禁止在数字中出现0的概念!
罗马数字的表示主要依赖以下几个基本符号:
I 1
V 5
X 10
L 50
C 100
D 500
M 1000
这里,我们只介绍一下1000以内的数字的表示法。
单个符号重复多少次,就表示多少倍。最多重复3次。比如:CCC表示300 XX表示20,但150并不用LLL表示,这个规则仅适用于I X C M。
如果相邻级别的大单位在右,小单位在左,表示大单位中扣除小单位。比如:IX表示9 IV表示4 XL表示40 更多的示例参见下表,你找到规律了吗?
本题目的要求是:请编写程序,由用户输入若干个罗马数字串,程序输出对应的十进制表示。
输入格式是:第一行是整数n,表示接下来有n个罗马数字(n<100)。以后每行一个罗马数字。罗马数字大小不超过999。
要求程序输出n行,就是罗马数字对应的十进制数据。
例如,用户输入:
3
LXXX
XCIII
DCCII
则程序应该输出:
80
93
702
#include<cstdio>
#include<iostream>
#include<cstring>
using namespace std;
char a[] = {'I', 'V', 'X', 'L', 'C', 'D', 'M'};
char s[101];
int getIndex(char c) {
for (int i = 0; i < 7; i++) {
if (c == a[i]) return i+1;
}
return 0;
}
int getNum(char c) {
int num = 0;
switch(c) {
case 'I':num = 1;break;
case 'V':num = 5;break;
case 'X':num = 10;break;
case 'L':num = 50;break;
case 'C':num = 100;break;
case 'D':num = 500;break;
case 'M':num = 1000;break;
}
return num;
}
int main() {
freopen("in1.txt", "r", stdin);
int n, right, left;
scanf("%d", &n);
while(n--) {
scanf("%s", s);
int len = strlen(s);
int sum = 0;
sum = getNum(s[len-1]);
for (int i = len-1; i > 0; i--) {
int indexLeft = getIndex(s[i-1]);
int indexRight = getIndex(s[i]);
left = getNum(s[i-1]);
if (indexRight > indexLeft) {
sum -= left;
} else if (indexRight <= indexLeft) {
sum += left;
}
}
cout << sum << endl;
}
return 0;
}