FCC--Roman Numeral Converter(将给定的数字转换成罗马数字)

本文深入讲解罗马数字的计数规则及转换方法,包括特殊数字的处理,并提供两种实用的JavaScript函数实现,帮助读者理解并掌握罗马数字的转换技巧。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

关于罗马数字

1.罗马数字选用7个罗马字母(大写)作数字,代表的十进制数字如下:

在这里插入图片描述
一些数字用罗马数字表示为:
在这里插入图片描述

2.罗马数字的计数规则:

(1) 相同数字连写,则值相加,如III = 3;

(2) 小的数在大的数右边,也是累加,如VI = 6;

(3) 小的数在大的数左边,结果为大数减小数,如IV = 4;

(4) 在数的上方划一条横线,表示扩大1000倍。

一个简单粗暴的例子:
在这里插入图片描述
但是,我们会遇到一些特别的情况:

(1) 3999 = MMMCMXCIX,3999 = MMMDCCCCLXXXXVIIII,两种结果都是3999,但是我们一般会选择简单的,也就是前者;

(2) 同理,3444 = MMMCDXLIV, 3444 = MMMCCCCXXXXIIII,也是选择前者的方式。

于是,先把1~9的情况都列举一下:
在这里插入图片描述
可以看出,罗马数字对4和9的处理是不同与其他的。

列举4、9有关的部分数字:
在这里插入图片描述

思路和代码实现

1.先把数字转化为相应的罗马字母,如3999 = MMMDCCCCLXXXXVIIII;

2.再通过replace()将4和9的情况进行替换,使得3999 = MMMCMXCIX。

function convert(num) {
    var newArr = [];
    var newStr;
    //先把数字转化为相应的罗马字母
    while(num > 0) {
        if(num - 1000 >= 0) {
            newArr.push('M');
            num -= 1000;
        } else if (num - 500 >= 0) {
            newArr.push('D');
            num -= 500;
        } else if (num - 100 >= 0) {
            newArr.push('C');
            num -= 100;
        } else if (num - 50 >= 0) {
            newArr.push('L');
            num -= 50;
        } else if(num - 10 >= 0) {
            newArr.push('X');
            num -= 10;
        } else if(num - 5 >= 0) {
            newArr.push('V');
            num -= 5;
        } else if(num - 1 >= 0) {
            newArr.push('I');
            num -= 1;
        }
    }
    newStr = newArr.join('');
    //将4和9的情况进行替换
    newStr = newStr.replace(/VI{4}|LX{4}|DC{4}|I{4}|X{4}|C{4}/g, function(match) {
        switch(match) {
            case 'VIIII':
                return "IX";
            case 'LXXXX':
                return "XC";
            case 'DCCCC':
                return "CM";
            case 'IIII':
                return "IV";
            case 'XXXX':
                return "XL";
            case 'CCCC':
                return "CD";  
        }
    });
    return newStr;
}

至此,基本功能已经实现了。

另外,用for循环测试了前几千个较小的数,都是能正常转换的,较大的数长度会较长,因为没有对5000,10000等数进行处理。

或者:
将这些特殊的数字和罗马数字一一对应的存在数组中,当输入的值num大于某一个数时一直循环下去,直到数组最后。

function convert(num) {
 var nums = [1000,900,500,400,100,90,50,40,10,9,5,4,1];
  var romans =["m","cm","d","cd","c","xc","l","xl","x","ix","v","iv","i"];
  var str = '';
  nums.forEach(function(item,index,array){
    while(num >= item){
      str += romans[index];
      num -= item;
    }
  });
  
 return str.toUpperCase();
}
 
convert(36);

原文链接: https://www.cnblogs.com/alicell/p/9179246.html
https://blog.csdn.net/qq_37399074/article/details/68922119

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值