LCP:13 整数转罗马数字[not include in mleetcode]

最近的leetcode问题好难啊。都是动态规划类的,一杯茶,一包盐,一道leetcode做一天。
不如来点欢乐的,做道无限if的题目娱乐一下心神。这个就不收录在leetcode笔记专栏里了

LCP:13 整数转罗马数字

七个不同的符号代表罗马数字,其值如下:

符号 值
I 1
V 5
X 10
L 50
C 100
D 500
M 1000
罗马数字是通过添加从最高到最低的小数位值的转换而形成的。将小数位值转换为罗马数字有以下规则:

如果该值不是以 4 或 9 开头,请选择可以从输入中减去的最大值的符号,将该符号附加到结果,减去其值,然后将其余部分转换为罗马数字。
如果该值以 4 或 9 开头,使用 减法形式,表示从以下符号中减去一个符号,例如 4 是 5 (V) 减 1 (I): IV ,9 是 10 (X) 减 1 (I):IX。仅使用以下减法形式:4 (IV),9 (IX),40 (XL),90 (XC),400 (CD) 和 900 (CM)。
只有 10 的次方(I, X, C, M)最多可以连续附加 3 次以代表 10 的倍数。你不能多次附加 5 (V),50 (L) 或 500 (D)。如果需要将符号附加4次,请使用 减法形式。
给定一个整数,将其转换为罗马数字。

1 <= num <= 3999

示例 1:

输入:num = 3749

输出: “MMMDCCXLIX”

解释:

3000 = MMM 由于 1000 (M) + 1000 (M) + 1000 (M)
700 = DCC 由于 500 (D) + 100 © + 100 ©
40 = XL 由于 50 (L) 减 10 (X)
9 = IX 由于 10 (X) 减 1 (I)
注意:49 不是 50 (L) 减 1 (I) 因为转换是基于小数位

注意到题目的范围很小,就到千位数。无限if了解一下

class Solution {
public:
    string intToRoman(int num) {
           string answer;
           int LON=1000;
           int loc;
           loc=num/LON;
           //千位的处理
           if(loc==1)  answer=answer+"M";
            if(loc==2)  answer=answer+"MM";
             if(loc==3)  answer=answer+"MMM";
           //百位的处理
           num=num%LON;
           LON/=10;
           loc=num/LON;
           if(loc==1) answer=answer+"C";
           if(loc==2) answer=answer+"CC";
           if(loc==3) answer=answer+"CCC";
           if(loc==4) answer=answer+"CD";
           if(loc==5) answer=answer+"D";
           if(loc==6) answer=answer+"DC";
           if(loc==7) answer=answer+"DCC";
           if(loc==8) answer=answer+"DCCC";
           if(loc==9) answer=answer+"CM";
           //十位的处理
           num=num%LON;
           LON/=10;
           loc=num/LON;
           if(loc==1) answer=answer+"X";
           if(loc==2) answer=answer+"XX";
           if(loc==3) answer=answer+"XXX";
           if(loc==4) answer=answer+"XL";
           if(loc==5) answer=answer+"L";
           if(loc==6) answer=answer+"LX";
           if(loc==7) answer=answer+"LXX";
           if(loc==8) answer=answer+"LXXX";
           if(loc==9) answer=answer+"XC";
           //个位的处理
           num=num%LON;
           LON/=10;
           loc=num/LON;
           if(loc==1) answer=answer+"I";
           if(loc==2) answer=answer+"II";
           if(loc==3) answer=answer+"III";
           if(loc==4) answer=answer+"IV";
           if(loc==5) answer=answer+"V";
           if(loc==6) answer=answer+"VI";
           if(loc==7) answer=answer+"VII";
           if(loc==8) answer=answer+"VIII";
           if(loc==9) answer=answer+"IX";

           return answer;
    }
};

什么?这代码太丑了?写的漂亮点

下面是leetcode的官方题解,写的确实是漂亮一些啊

const string thousands[] = {"", "M", "MM", "MMM"};
const string hundreds[]  = {"", "C", "CC", "CCC", "CD", "D", "DC", "DCC", "DCCC", "CM"};
const string tens[]      = {"", "X", "XX", "XXX", "XL", "L", "LX", "LXX", "LXXX", "XC"};
const string ones[]      = {"", "I", "II", "III", "IV", "V", "VI", "VII", "VIII", "IX"};

class Solution {
public:
    string intToRoman(int num) {
        return thousands[num / 1000] + hundreds[num % 1000 / 100] + tens[num % 100 / 10] + ones[num % 10];
    }
};

好的。也是水完了一文 记录了一下生活,继续去研究算法去♪(´▽`)

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值