每日算法——letcode系列


问题 Integer to Roman

Difficulty: Medium

Given an integer, convert it to a roman numeral.

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

class Solution {
public:
    string intToRoman(int num) {
        
    }
};

翻译

整数转罗马数字

难度系数:中等

给定一个整数,转成罗马数字。

输入的整数的范围在1到3999间

思路

这个题感觉是在考罗马数字, 先百度百科或维基百科下。

罗马数字共有七个,即I(1),V(5),X(10),L(50),C(100),D(500),M(1000)。按照下面的规则可以表示任意正整数。

重复数次:一个罗马数字重复几次,就表示这个数的几倍。

右加左减:在一个较大的罗马数字的右边记上一个较小的罗马数字,表示大数字加小数字。在一个较大的数字的左边记上一个较小的罗马数字,表示大数字减小数字。但是,左减不能跨越等级。比如,99不可以用IC表示,用XCIX表示。

加线乘千:在一个罗马数字的上方加上一条横线或者在右下方写M,表示将这个数字乘以1000,即是原数的1000倍。同理,如果上方有两条横线,即是原数的1000000倍。

单位限制:同样单位只能出现3次,如40不能表示为XXXX,而要表示为XL。

其实一个整数, 可以先选七个中最大可经表示的,再把这个整数减去这个数再递归
例如: 6 最大可以是V(5), 剩下一个是1, 则 6 = VI

代码

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

carlblack
4 声望16 粉丝