首页 > 代码库 > Leetcode:integer_to_roman

Leetcode:integer_to_roman

一、     题目

   将给定的数字(阿拉伯数字)转化成罗马数字。数字不会大于3999

二、     分析

   首先我们要知道神马是罗马数字,虽然听说过,但其实我还真没有记住,于是就google了下,详细见下:

个位数举例

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】 XV, 15 】XVI, 16 】XVII, 17 】XVIII, 18】 XIX, 19】 XX, 20】  XXI, 21 】XXII, 22 】XXIX, 29】 XXX, 30】 XXXIV, 34】 XXXV, 35 】XXXIX, 39】 XL, 40】 L, 50 】LI, 51】 LV, 55】 LX, 60】 LXV, 65】 LXXX, 80】 XC, 90 】XCIII, 93】 XCV, 95 】XCVIII, 98】 XCIX, 99 】

百位数举例

C, 100】 CC, 200 】CCC, 300 】CD, 400】 D, 500 】DC,600 】DCC, 700】 DCCC, 800 】CM, 900】 CMXCIX,999】

千位数举例

M, 1000】 MC, 1100 】MCD, 1400 】MD, 1500 】MDC, 1600 】MDCLXVI, 1666】MDCCCLXXXVIII, 1888 】MDCCCXCIX, 1899 】MCM, 1900 】MCMLXXVI,1976】 MCMLXXXIV, 1984】 MCMXC, 1990 】MM, 2000 】MMMCMXCIX, 3999】

正好有我们要求的最大数。

      于是我们可以想到,我们只需要将数字与上面的数字对应即可。

1.     首先,我们要先确定高位即千位的数字,即判断究竟是1000还是2000还是3000,于是可以想到每次将num减去1000,并加上一个”M”。

2.     然后,我们判断百位的数字,即可以用num/100来得到百位的数字

3.     再次就是十位和个位,同2的做法

将每一个位的字母从左到右连接在一起即构成了我们的结果。

另外,在CSDN上看到一个童鞋的方法很好

I = 1;

V = 5;

X = 10;

L = 50;

C = 100;

D = 500;

M = 1000;

其中每两个阶段的之间有一个减法的表示,比如900=CM, C写在M前面表示M-C。范围给到3999,情况不多直接打表其实更快,用代码判断表示估计比较繁琐。然后就是贪心的做法,每次选择能表示的最大值,把对应的字符串连起来。


class Solution {
public:
    string intToRoman(int num) {
        string str;
		char *hu[] = {"","C","CC","CCC","CD","D","DC","DCC","DCCC","CM"};
		char *te[] = {"","X","XX","XXX","XL","L","LX","LXX","LXXX","XC"};
		char *on[] = {"","I","II","III","IV","V","VI","VII","VIII","IX"};
		
		while(num>=1000) {
			str+="M";
			num-=1000;
		}
		str += hu[num/100];
		num=num%100;
		str += te[num/10];
		num=num%10;
		str+=on[num];
		return str; 
    }
};

法2:
class Solution {
public:
    string intToRoman(int num) {
        string str;  
        string symbol[]={"M","CM","D","CD","C","XC","L","XL","X","IX","V","IV","I"};  
        int value[]=    {1000,900,500,400, 100, 90,  50, 40,  10, 9,   5,  4,   1}; 
        for(int i=0;num!=0;++i)
        {
            while(num>=value[i])
            {
                num-=value[i];
                str+=symbol[i];
            }
        }
        return str;
    }
}; 

法3:JAVA
class Solution {
public:
    string intToRoman(int num) {
        int[] values = {1000, 900, 500, 400, 100,90, 50, 40, 10, 9, 5, 4, 1 };
        String[] numerals = {"M", "CM", "D", "CD", "C", "XC", "L", "XL", "X", "IX", "V", "IV", "I" };
        StringBuilder result = new StringBuilder();
        for (int i = 0; i < values.length; i++) {
            while (number >= values[i]) {
                number -= values[i];
                result.append(numerals[i]);
            }
        }
        return result.toString();
    }
};


Leetcode:integer_to_roman