蓝桥杯罗马数字

古罗马帝国开创了辉煌的人类文明,但他们的数字表示法的确有些繁琐,尤其在表示大数的时候,现在看起来简直不能忍受,所以在现代很少使用了。之所以这样,不是因为发明表示法的人的智力的问题,而是因为一个宗教的原因,当时的宗教禁止在数字中出现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 更多的示例参见下表,你找到规律了吗?


  I,1
  II,2
  III,3
  IV,4
  V,5
  VI,6
  VII,7
  VIII,8
  IX,9

  X,10
  XI,11
  XII,12
  XIII,13
  XIV,14
  XV,15
  XVI,16
  XVII,17
  XVIII,18
  XIX,19
  XX,20
  XXI,21
  XXII,22
  XXIX,29
  XXX,30
  XXXIV,34
  XXXV,35
  XXXIX,39
  XL,40
  L,50
  LI,51
  LV,55
  LX,60
  LXV,65
  LXXX,80
  XC,90
  XCIII,93
  XCV,95
  XCVIII,98
  XCIX,99

  C,100
  CC,200
  CCC,300
  CD,400
  D,500
  DC,600
  DCC,700
  DCCC,800
  CM,900
  CMXCIX,999

  本题目的要求是:请编写程序,由用户输入若干个罗马数字串,程序输出对应的十进制表示。

  输入格式是:第一行是整数n,表示接下来有n个罗马数字(n<100)。以后每行一个罗马数字。罗马数字大小不超过999。

  要求程序输出n行,就是罗马数字对应的十进制数据。

  例如,用户输入:
  3
  LXXX
  XCIII
  DCCII

  则程序应该输出:
  80
  93
  702 

蓝桥杯罗马数字,转化罗马数字为十进制数并输出

 思路,利用C++map将IVXLCDM与十进制数挂钩。对于输入的罗马数字字符串,和十进制类似,我采用从低位到高位的方式转化(从右向左转化),仔细观察,对于n个罗马字符数字字符串,从低位开始编号,依次是第n-1、n-2、...、0位,发现低位(第n到第n-k+1位)表示的十进制数字小于第n-k位时,我们需要加上第n-k位的数字,当第n-k位与第n-k+1数字相同时,我们也需要加上第n-k位数字;此外的其他情况,我们需要减去第n-k位的数字,k取值1、2、3、...、n.当只有一个字符时,直接输出对应的十进制数字即可。

求罗马数字字符串对应的十进制数字,以上规律在十进制数字在1-1000范围内是成立的。

 AC代码如下

#include <iostream>
#include <map>
using namespace std;
map<char, int> transfer;
int main() {
	char s_cin[10];
	int s_judgement[10];
	transfer['I'] = 1; transfer['V'] = 5;
	transfer['X'] = 10; transfer['L'] = 50;
	transfer['C'] = 100; transfer['D'] = 500;
	transfer['M'] = 1000;
	int n;
	cin >> n;
	for (int i = 1; i <= n; i++) {
		cin >> s_cin;
		int k = 0; int res = 0;
		while (s_cin[k] != '\0') {
			s_judgement[k] = transfer[s_cin[k]];
			k++;
		}
		k--;
		if (k == 0) {
			res += s_judgement[k];
		}
		else {
			while (k >= 0) {
				if (s_judgement[k]>=res||s_judgement[k]==s_judgement[k+1]) {
					res += s_judgement[k];
				}
				else
				{
					res -= s_judgement[k];
				}
				k--;
			}
		}
		
		cout << res << endl;
	}
	return 0;
}

该题的测试数据如下

8
XLV
LXXXIX
CXCVII
CCCLXIV
CDII
CDXX
DCXV
CMXLII
 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值