每日算法之十二:Roman to Integer

来源:互联网 发布:2015年度十大网络用语 编辑:程序博客网 时间:2024/05/18 07:49

Given a roman numeral, convert it to an integer.

Input is guaranteed to be within the range from 1 to 3999.

class Solution {public:int toNUm(char ch){switch(ch){case 'I':return 1;case 'V':return 5;case 'X':return 10;case 'L':return 50;case 'C':return 100;case 'D':return 500;case 'M':return 1000;default:return 0;}}    int romanToInt(string s) {    int num = 0;    for(int i = 0;i<s.size();i++)    {    if(toNUm(s[i])>=toNUm(s[i+1]))    num += toNUm(s[i]);    else    num -= toNUm(s[i]);    }    return num;            }};

罗马数字

你肯定见过罗马数字,即使你不认识他们。你可能在版权信息、老电影、电视、大学或者图书馆的题词墙看到(用CopyrightMCMXLVI表示版权信息,而不是用?“Copyrigh1946。你也可能在大纲或者目录参考中看到他们。这种系统的数字表达方式可以追溯到罗马帝国(因此而得名)。在罗马数字中,有七个不同的数字可以以不同的方式结合起来表示其他数字。
  I=1
  V=5
  X=10
  L=50
  C=100
  D=500
  M=1000
下面是几个通常的规则来构成罗马数字:

  大部分时候用字符相叠加来表示数字。I 是1,II 是2,III 是3。VI 是6(挨个看来,是"5和1"的组合)VII 是7,VIII 是8


 含有10 的字符(I,X,C 和M)最多可以重复出现三个。为了表示4,必须用同一位数的下一个更大的数字5 来减去一。不能用IIII 来表示4,而应该是IV(意思是比5 小1)。40 写做XL(比50 小10),41 写做 XLI,42 写做XLII,43 写做 XLIII,44 写做XLIV(比50 小10 并且比5 小 1)。

 

  有些时候表示方法恰恰相反。为了表示一个中间的数字,需要从一个最终的值来减。比如:9 需要从10 来减:8 是VIII,但9 确是IX(比10 小1),并不是VIII(I 字符不能重复4 次)。90 是XC,900 是CM。


  表示5 的字符不能在一个数字中重复出现。10 只能用X 表示,不能用VV 表示。100 只能用C 表示,而不是LL。

 

  罗马数字是从左到右来计算,因此字符的顺序非常重要。DC表示600,而CD 完全是另一个数字400(比500 小100)。CI是101,IC 不是一个罗马数字(因为你不能从100 减1,你只能写成XCIX,表示比100 小10,且比10 小1)。



0 0
原创粉丝点击