首页 > 代码库 > [LeetCode]Integer to Roman

[LeetCode]Integer to Roman

Given an integer, convert it to a roman numeral.

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

class Solution {
public:

    char convert(char s, int i)
    {
	    std::string table = "IVXLCDM";
	    if (s == ‘I‘)  return table[i];
	    if (s == ‘V‘)  return table[i + 1];
	    if (s == ‘X‘)  return table[i + 2];
    }
    string intToRoman(int num)
    {
        std::string str[10] = {"", "I", "II", "III", "IV", "V", "VI", "VII", "VIII", "IX"};
 	    std::vector<std::string> table;
	    std::string ans;
	    for (int i = 0; i < 10; i++)
	    {
	    	table.push_back(str[i]);
	    }
	    for (int i = 0; num; i += 2, num /= 10)
	    {
            int x = num % 10;
            std::string temp = table[x];
	    	for (int j = 0; j < temp.size(); j++)
	    	{
		    	temp[j] = convert(temp[j], i);
	    	}
		    ans = temp + ans; //顺序不能颠倒
    	}
	    return ans;
    }
};


下面附有罗马数字的简介:

Ⅰ Ⅱ Ⅲ Ⅳ Ⅴ Ⅵ Ⅶ Ⅷ Ⅸ Ⅹ简单的罗马数字见下: 
I - 1 
II - 2 
III - 3 
IV - 4 
V - 5 
VI - 6 
X - 10 
L - 50 
C - 100 
D - 500 
M - 1000 
罗马数字共有七个,即I(1),V(5),X(10),L(50),C(100),D(500),M(1000)。按照下面的规则可以表示任意正整数。 
重复数次:一个罗马数字重复几次,就表示这个数的几倍。如:"III"表示"3";"XXX"表示"30"。 
右加左减:在一个较大的罗马数字的右边记上一个较小的罗马数字,表示大数字加小数字,如"VI"表示"6","DC"表示"600"。一个代表大数字的符号左边附一个代表小数字的符号,就表示大数字减去小数字的数目,如"IV"表示"4","XL"表示"40","VD"表示"495"。尽管在一个较大的数字的左边记上一个较小的罗马数字,表示大数字减小数字。但是,左减不能跨越等级。比如,99不可以用IC表示,肵CIX表示。 
加线乘千:在一个罗马数字的上方加上一条横线或者在右下方写M,表示将这个数字乘以1000,即是原数的1000倍。同理,如果上方有两条横线,即是原数的1000000倍。 
罗马数字起源于古罗马。一共有7个数字符号:IVXLCDM.相应的阿拉伯数字表示为:1510501005001000用罗马数字表示数时,如果几个相同的数字并列,就表示这个数的值是数码的几倍。倒如:罗马数字要表示3,可以写成III;要表示20,可以写成XX;要表示30,可写成XXX。单位限制:同样单位只能出现3次,如40不能表示为XXXX,而要表示为XL。
不相同的几个数码并列时,如果小的数码在右边,就表示数的数值是这几个数码的和;如果小的数码在基边,就表示数的数值是数码之差。例如:6用罗马数字可以表示为VI;4用罗马数字表示为IV;11用罗马数字表示为XI;48用罗马数字表示为IIL。