[Leetcode] Integer to Roman

13 篇文章 0 订阅
12 篇文章 0 订阅

Given an integer, convert it to a roman numeral.

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


/*roman background
Symbol     Value
I     1
V     5
X     10
L     50
C     100
D     500
M     1,000
Numbers are formed by combining symbols together and adding the values.
Symbols are placed from left to right in order of value, starting with the largest
in a few specific cases,to avoid four characters being repeated in succession (such as IIII or XXXX) these can be reduced using subtractive notation as follows:
    the numeral I can be placed before V and X to make 4 units (IV) and 9 units (IX respectively)
    X can be placed before L and C to make 40 (XL) and 90 (XC respectively)
    C can be placed before D and M to make 400 (CD) and 900 (CM) according to the same pattern
*/

 /*algorithm iterative version
        for number n,according to n's value
        1)try subtractive value (1000,...1) from n
        2)loop this process
    */
    string intToRoman(int num) {
        unordered_map<int,string>table={
            {1,"I"},{4,"IV"},{5,"V"},{9,"IX"},{10,"X"},
            {40,"XL"},{50,"L"},{90,"XC"},{100,"C"},
            {400,"CD"},{500,"D"},{900,"CM"},{1000,"M"}
        };
        string r;
        //for code simplicity,use array to omiit too much condition check
        int keys[13]={1000,900,500,400,100,90,50,40,10,9,5,4,1};
        for(;num;){
            for(int k = 0;k < 13;k++){
                if(num >= keys[k]){
                    r.append(table[keys[k]]);
                    num -= keys[k];
                    break;
                }
            }
        }
        return r;
    }


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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值