蓝桥杯历届-罗马数字

蓝桥杯历届-罗马数字


古罗马帝国开创了辉煌的人类文明,但他们的数字表示法的确有些繁琐,尤其在表示大数的时候,现在看起来简直不能忍受,所以在现代很少使用了。之所以这样,不是因为发明表示法的人的智力的问题,而是

因为一个宗教的原因,当时的宗教禁止在数字中出现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;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值