题目描述:
难度:Middle
相关话题:数学
、字符串
罗马数字包含以下七种字符: I
, V
, X
, L
, C
, D
和 M
。
字符 数值
I 1
V 5
X 10
L 50
C 100
D 500
M 1000
例如, 罗马数字 2 写做 II
,即为两个并列的 1。12 写做 XII
,即为 X
+ II
。 27 写做 XXVII
, 即为 XX
+ V
+ II
。
通常情况下,罗马数字中小的数字在大的数字的右边。但也存在特例,例如 4 不写做 IIII
,而是 IV
。数字 1 在数字 5 的左边,所表示的数等于大数 5 减小数 1 得到的数值 4 。同样地,数字 9 表示为 IX
。这个特殊的规则只适用于以下六种情况:
I
可以放在 V
(5) 和 X
(10) 的左边,来表示 4 和 9。
X
可以放在 L
(50) 和 C
(100) 的左边,来表示 40 和90。
C
可以放在 D
(500) 和 M
(1000) 的左边,来表示400 和900。
给定一个整数,将其转为罗马数字。输入确保在 1到 3999 的范围内。
示例1:
示例2:
示例3:
示例4:
输入:58
输出: "LVIII"
解释: L = 50, V = 5, III = 3.
示例5:
输入:1994
输出: "MCMXCIV"
解释: M = 1000, CM = 900, XC = 90, IV = 4.
思路:
注意4
和9
的处理方式,由于9
的罗马文需要用到10
,
I(1),V(5),X(10)
处理范围[1,9]
; X(10),L(50),C(100)
处理范围[10,90]
; C(100),D(500),M(1000)
处理范围[100,900]
;
确定好处理范围后,对数字的每一位进行处理,再叠加字符串就是结果。
/**
* @来源: Javascript中文网 - 前端进阶资源教程 https://www.javascriptc.com/
* @介绍:一个致力于帮助开发者用代码改变世界为使命的平台,每天都可以在这里找到技术世界的头条内容
* @param {number} num
* @return {string}
*/
var intToRoman = function(num) {
let bit={}
bit[0]=['I','V','X']
bit[1]=['X','L','C']
bit[2]=['C','D','M']
bit[3]=['M']
function toRoman(n,cur){
if(n===0)return ''
if(n<4)return cur[0].repeat(n)
if(n===4)return cur[0]+cur[1]
if(n<9)return cur[1]+cur[0].repeat(n-5)
if(n===9)return cur[0]+cur[2]
}
let str=num+''
let len=str.length
let res=''
let N=num
for(let i=len;i>=1;i--){
let curMod=Math.pow(10,i-1)
let n=Math.floor(N/curMod)
N %=curMod
res+=toRoman(n,bit[i-1])
}
return res
};
扩展阅读: