罗马数字转为阿拉伯数字

 1 /* I:1 ; V-5;X-10;L-50;C-100;D-500;M-1000*/
 2 class Solution{
 3     vector<string> tokens;
 4     vector<char> token_value;
 5     public:
 6     /*divide the string into some tokens,every token including same char*/
 7     void token(string s)
 8     {
 9         string::iterator i=s.begin();
10         string::iterator j=s.begin();
11
12         while(i!=s.end())
13         {
14             char cur=*i;
15             token_value.push_back(cur);
16             while(*i == cur){
17                 i++;
18             }
19
20             string temp(j,i);
21             tokens.push_back(temp);
22             j=i;
23         }
24     }
25     /*比较相邻字母的大小*/
26     bool lower(char a,char b)
27     {
28         if((a==‘I‘ && b!=‘I‘)||(a==‘V‘ && b!=‘I‘&&b!=‘V‘) || (a==‘X‘&&b!=‘I‘&&b!=‘V‘&&b!=‘X‘)|| 29                 (a==‘L‘&&b!=‘I‘&&b!=‘V‘&&b!=‘X‘&&b!=‘L‘)||(a==‘C‘ && (b==‘D‘ || b==‘M‘)) || (a==‘D‘&&b==‘M‘))
30             return true;
31         else return false;
32     }
33     int romanToInt(string s){
34         token(s);
35         int result=0;
36         vector<int> res;
37         /*将上述tokens转为一个int数组*/
38         for(vector<string>::iterator i=tokens.begin();i!=tokens.end();i++)
39         {
40             string temp=*i;
41             int temp_value=0;
42             char cur=temp[0];
43             int len=temp.size();
44             for(int i=0;i<len;i++)
45             {
46                 switch(cur)
47                 {
48                     case ‘I‘:temp_value++;break;
49                     case ‘V‘:temp_value+=5;break;
50                     case ‘X‘:temp_value+=10;break;
51                     case ‘L‘:temp_value+=50;break;
52                     case ‘C‘:temp_value+=100;break;
53                     case ‘D‘:temp_value+=500;break;
54                     case ‘M‘:temp_value+=1000;break;
55                     default:break;
56                 }
57
58             }
59             res.push_back(temp_value);
60
61         }
62         result=res[res.size()-1];
63         for(int i=token_value.size()-2;i>=0;i--)
64         {
65             if(lower(token_value[i],token_value[i+1])){
66                 result-=res[i];
67             }
68             else{
69                 result+=res[i];
70             }
71             cout<<result<<endl;
72         }
73         return result;
74     }
75 };1. 首先去维基百科查阅罗马数字的规范和表示方法;2. 由于做词法分析的缘故,对字符串的问题总是习惯分解成token来做,首先我将罗马数字按照其类别分成很多组,每一组内的元素都是相同的,然后将每组的值计算出来;3. 现在得到了2个新的数组,一个是由罗马数字类别组成的数组(可看成原字符串去掉重复之后的结果),另一个是上一个数组的结果数组;4. 最后我们根据第一个数组的char 的大小关系来对结果数组进行求值,从右向左求值,左边比右边大,就加上左边的,否则减去左边的值。
时间: 2024-10-05 21:01:47

罗马数字转为阿拉伯数字的相关文章

罗马数字转阿拉伯数字

罗马数字转阿拉伯数字 1.罗马数字是位置计数吗?它的缺点是什么? 答:罗马数字不是位置技术,他的缺点:书写困难,规则繁杂,没有数字0 罗马数字包含以下七种字符:I, V, X, L,C,D 和 M.(python) 字符          数值 I             1 V             5 X             10 L             50 C             100 D             500 M             1000 2.将学号2

58. 分析、测试与总结:罗马数字和阿拉伯数字的转换[roman to integer and integer to roman in c++]

[本文链接] http://www.cnblogs.com/hellogiser/p/roman-to-integer-and-integer-to-roman.html [题目] 给出一个罗马数字,转换为阿拉伯数字.本题只考虑3999以内的数. 罗马数字有如下符号: Ⅰ(1)Ⅴ(5)Ⅹ(10)L(50)C(100)D(500)M(1000) 计数规则: (1).若干相同数字连写表示的数是这些罗马数字的和,如III=3: (2).小数字在大数字前面表示的数是用大数字减去小数字,如IV=4: (3

LeetCode 13.Roman to Integer 罗马数字转阿拉伯数字

对于罗马数字转阿拉伯数字切入点有两个: 1.小数字出现在大数字前面只能使用一个(例如IV正确,IIV就是错误的) 2.除了情况1之外直接使用累加就ok 1 public int romanToInt(String s){ 2 if(s.length() < 1){ 3 return 0; 4 } 5 int result = 0; 6 for(int i=0;i<s.length();i++){ 7 result += getRomanValue(s.charAt(i)); 8 if(i<

罗马数字与阿拉伯数字相互转换

罗马数字规则简明 1. 罗马单个数字共有7个,即I(1).V(5).X(10).L(50).C(100).D(500)和M(1000)2.一个罗马数字重复几次,就表示这个数的几倍.但同一数码不能出现三次以上.3.遵循右加左减的规则.左减的数字有限制,仅限于I.X.C.比如45不可以写成VL,只能是XLV但是,左减时不可跨越一个位数.比如,99不可以用IC(100 - 1)表示,而是用XCIX([100 - 10] + [10 - 1])表示.(等同于阿拉伯数字每位数字分别表示.)左减数字必须为一

Leetcode——罗马数字和阿拉伯数字的转换

说实话,这两道在leetcode上标记为中等和简单的题却让我蛋疼了半天.可能是因为先天对阿拉伯数字不熟悉的关系,所以在做两道题的居然没有一点感觉!!!!! 将罗马数字转化为阿拉伯数字比较简单:从左向右扫描整个字符串既可,只有在前一个数字比后一个数字小的时候需要做特殊处理(需要做减法). class Solution  { public: int romanToInt(string s) { if (s.empty()) { return 0; } int letter[256]; for (in

[leetcode]罗马数字和阿拉伯数字相互转换

罗马转阿拉伯 public int romanToInt(String s) { /* 从左到右依次根据哈希表进行加法 如果是"CM"900这种情况就要执行+M和-C处理 */ if (s.length()==0) return 0; Map<Character,Integer> map = new HashMap<>(); map.put('I', 1); map.put('V', 5); map.put('X', 10); map.put('L', 50);

LeetCode解题报告--Roman to Integer

题目:罗马数字转为阿拉伯数字 Given a roman numeral, convert it to an integer. Input is guaranteed to be within the range from 1 to 3999. 分析:题意:将给定的罗马数字转为阿拉伯数字 从前往后遍历罗马数字,如果某个数比前一个数小,则把该数加入到结果中: 反之,则在结果中两次减去前一个数并加上当前这个数: java 代码:(accepted) import java.util.HashMap;

Java-Roman to Integer

Given a roman numeral, convert it to an integer. Input is guaranteed to be within the range from 1 to 3999. 将罗马数字转为阿拉伯数字 对应转换表如下: 个位数举例 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] X

罗马数字

罗马数字是最古老的数字表示方式,比阿拉伯数字早2000多年,起源于罗马 罗马数字有如下符号: 计数规则: 1.相同的数字连写,所表示的数等于这些数字相加得到的数,例如:III = 3: 2.小的数字在大的数字右边,所表示的数等于这些数字相加得到的数,例如:VIII = 8; 3.小的数字,限于(I.X和C)在大的字数左边,所表示的数等于大数减去小数所得的数,例如:IV = 4; 4.正常使用时,连续的数字重复不得超过三次: 5.在一个数的上面画横线,表示这个数扩大1000倍(若只考虑3999以内