博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
JS 整数与罗马数字相互转换(1~3999)
阅读量:3917 次
发布时间:2019-05-23

本文共 2058 字,大约阅读时间需要 6 分钟。

JS 整数转成罗马数字(1~3999)

在刷题的时候遇到一个比较有意思的题目,码一下

题目描述:

输入一个 1 ~ 3999 的整数,将其转成罗马数字。
罗马数字与整数的互换如下:

字符          数值I             1V             5X             10L             50C             100D             500M             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。
这是数字转成罗马数字
var intToRoman = function(num) {    let map = {        1: 'I',        5: 'V',        10: 'X',        50: 'L',        100: 'C',        500: 'D',        1000: 'M'    }    // 标识位数    let digits = 1    // 结果    let result = ''    while(num) {        let current = num % 10        if (current < 4) {            result = map[digits].repeat(current) + result        } else if (current === 4) {            result = map[digits] + map[digits * 5] + result        } else if (current > 4 && current < 9) {            result = map[digits * 5] + map[digits].repeat(current - 5) + result        } else {            result = map[digits] + map[digits * 10] + result        }        digits *= 10        num = Math.trunc(num/10)    }    return result};
这是罗马数字转成数字
var romanToInt = function(s) {    let map = {        'I': 1,        'V': 5,        'X': 10,        'L': 50,        'C': 100,        'D': 500,        'M':1000    }    let index = 0    let result = 0    let len = s.length    while(index < len) {        let current = map[s[index]]        result += current        if (index > 0) {            let before = map[s[index-1]]            if ((current === 5 || current === 10) && before === 1) {                result -= 2            }            if ((current === 50 || current === 100) && before === 10) {                result -= 20            }            if ((current === 500 || current === 1000) && before === 100) {                result -= 200            }        }        index++    }    return result};

转载地址:http://rxprn.baihongyu.com/

你可能感兴趣的文章
程序员创业之如何获取第一笔风险投资
查看>>
听说小米进入世界500强啦?解读历年500强数据了解国情
查看>>
Maven中央仓库发布历程
查看>>
springBoot的过滤器,监听器,拦截器
查看>>
树状数组入门(简单的原理讲解)
查看>>
程序员的迷茫,迷茫的程序员
查看>>
datawhale课程[动手学数据分析]——Task01:数据加载及探索性数据分析
查看>>
datawhale课程[动手学数据分析]——Task02:数据清洗简述
查看>>
《统计学习方法第二版》学习笔记2——感知机
查看>>
《统计学习方法第二版》学习笔记3——K近邻法
查看>>
MySQL: win10安装MySQL 8.0.21成功记录【转载】
查看>>
IT从业者的迷思与求解之道——座谈会实录摘选
查看>>
程序员过关斩将--数据库的乐观锁和悲观锁并非真实的锁
查看>>
被忽略的TraceId,可以用起来了
查看>>
[原]调试PInvoke导致的内存破坏
查看>>
【NServiceBus】什么是Saga,Saga能做什么
查看>>
ASP.NET Core 集成测试中模拟登录用户的一种姿势
查看>>
程序员修神之路--容器技术为什么会这么流行(记得去抽奖)
查看>>
[ASP.NET Core 3框架揭秘] 异步线程无法使用IServiceProvider?
查看>>
.NET Core 3.0之深入源码理解HealthCheck(一)
查看>>