leetcode(12)整数转罗马数字

8 篇文章 0 订阅
12. 整数转罗马数字

这道题是将十进制的整数转换成罗马数字表示,由于罗马字母的限制,只能转换1到3999之间的数。根据题目描述以及示例,可以发现转换原理很简单,就是将十进制对应位上的数字转换成罗马对应的字母就可以了,对应关系如下:

字符数值
I1
V5
X10
L50
C100
D500
M1000

例如转换234为罗马数字,拆解每一位的值,找到对应的字符即可,234分解为:

200 “CC”

30 “XXX”

4 “IV”

234对应的罗马表示为:“CCXXXIV”

因此,这个算法只需要把输入的十进制整数拆解成
n × 10 m n \times \mathbf{10}^m n×10m
再转换成对应的罗马字母表示,最后将他们合并就是最终的转换结果。

下面是C++版的实现:

class Solution {
public:
    void appendValue(std::string& strRoman, int roman){
        if(roman < 4) 
            strRoman.append(roman, 'I');
        else if(roman == 4)
            strRoman.append("IV");
        else if(roman == 5)
            strRoman.append(1, 'V');
        else if(roman < 9)
            strRoman.append(1, 'V').append(roman - 5, 'I');
        else if(roman == 9)
            strRoman.append("IX");
        else if(roman < 40)
            strRoman.append(roman / 10, 'X');
        else if(roman == 40)
            strRoman.append("XL");
        else if(roman == 50)
            strRoman.append(1, 'L');
        else if(roman < 90)
            strRoman.append(1, 'L').append((roman - 50) / 10, 'X');
        else if(roman == 90)
            strRoman.append("XC");
        else if(roman < 400)
            strRoman.append(roman / 100, 'C');
        else if(roman == 400)
            strRoman.append("CD");
        else if(roman == 500)
            strRoman.append(1, 'D');
        else if(roman < 900)
            strRoman.append(1, 'D').append((roman - 500) / 100, 'C');
        else if(roman == 900)
            strRoman.append("CM");
        else if(roman < 4000)
            strRoman.append(roman / 1000, 'M');
    }
    string intToRoman(int num) {
        std::string strRoman;
        if(num > 0 && num < 4000){
            int div = 1000;
            while(!(num / div)) div /= 10;
            int remainder = 0;
            while(remainder = num % div){
                int roman = num - remainder;
                appendValue(strRoman, roman);
                num = remainder;
                div /= 10;
            }
            appendValue(strRoman, num);
        }
        return strRoman;
    }
};
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值