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();
    }
};


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值