每日一练2

SeedCoder2014热身题目4:IVXLCDM

描述:

罗马数字是欧洲在阿拉伯数字(实际上是印度数字)传入之前使用的一种数码,现在应用较少.它的产生晚于中国甲骨文中的数码,更晚于埃及人的十进位数字.但是,它的产生标志着一种古代文明的进步. 
 
罗马数字用7个拉丁字母IVXLCDM和读数规则来表示数.
 
I = 1
V = 5
X = 10
L = 50
C = 100
D = 500
M = 1000
 
读数规则有以下三条
 
(1)相同的数字连写,所表示的数等于这些数字相加得到的数,如:III就代表3;
(2)小的数字在大的数字的右边,所表示的数等于这些数字相加得到的数.如:VIII =8,XII=12;
(3)小的数字在大的数字的左边,所表示的数等于大数减小数得到的数,如IV=4.IX =9.
 
注意不会出现IIX这样的情况,即每个数字左边最多有一个值比它小的数字.
 
现在给你一些罗马数字表示下的数,要求你编写程序把它转换为用阿拉伯数字表示.
输入:

 输入文件包含多组测试数据,每组测试数据一行,给出一个罗马数字表示的数,只包含IVXLCDM的合法组合,字母子间没有空白字符.确保转换得到的阿拉伯数字不会超过3000.

输出:

 对于每一组测试数据,对应输出其阿拉伯数字表示.

样例:
输入:
DXII
输出:
512
#include <iostream>
#include <cstdio>
#include <map>
#include <vector>
#include <fstream>
#include <string>
using std::cin;
using std::cout;
using std::endl;
using std::map;
using std::vector;
using std::ifstream;
int main()
{
	map<char,int> m;
	m.insert(make_pair('I',1));
	m.insert(make_pair('V',5));
	m.insert(make_pair('X',10));
	m.insert(make_pair('L',50));
	m.insert(make_pair('C',100));
	m.insert(make_pair('D',500));
	m.insert(make_pair('M',1000));
	
	vector<string> input;
	string str;
	ifstream inputFile("G:\\seedcoder\\test.txt");
	while(getline(inputFile,str))
	{
		input.push_back(str);
	}
	int result=0;
	typedef vector<string>::iterator Iter;
	for(Iter iter=input.begin();iter!=input.end();++iter)
	{
		result=0;
		for(string::iterator istr=(*iter).begin();istr!=(*iter).end();++istr)
		{
			if((istr!=((*iter).end()-1))&&m[*istr]<m[*(istr+1)])
			{
				result-=m[*istr];
			}
			else
			{
				result+=m[*istr];
			}
		}
		cout<<result<<endl;
	}
}


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值