zoukankan      html  css  js  c++  java
  • 罗马数字转为阿拉伯数字

     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 的大小关系来对结果数组进行求值,从右向左求值,左边比右边大,就加上左边的,否则减去左边的值。
  • 相关阅读:
    NOIP201310华容道
    NOIP201110观光公交
    markdown
    【NOIP2016】愤怒的小鸟
    【NOIP2016】组合数问题
    [TJOI2019]唱,跳,rap,篮球(生成函数,组合数学,NTT)
    CF1217E Sum Queries? (线段树)
    CF1178F Short/Long Colorful Strip(DP)
    ZROI 暑期高端峰会2019 总结
    [HNOI2012]集合选数(构造,状态压缩,DP)
  • 原文地址:https://www.cnblogs.com/gaoduan/p/4055308.html
Copyright © 2011-2022 走看看