阿拉伯数字转罗马数字(Roman Numeral Converter)

  

如上图所示,罗马数字由7个基本字符组成['I','V','X','L','C','D','M'],阿拉伯数字num转换时需将数字经过求余运算,对千位以上、百位、十位和个位分别进行处理。

一、千位以上
num/1000的结果为n,结果字符串result需重复n次字符‘M’;可抽象如下函数,重复给定字符char, n次.

function repeatC(char,count){
  var result="";
  for(var i=0;i<count;i++){
    result+=char;
  }
  return result;
}

二、百位、十位和个位的处理
百位、十位、位的处理类似,以个位处理为例:
当1<=n<=3时,result字符串为重复特定字符 'I' n次;

当n==4时,4=5-1 result字符串为"IV";

当5<=n<=8时,result字符串为'V'+repeatC('I',n-5);

当n==9时,9=10-1,result字符串为"XI";

由此可看出个位数可由'I','V','X'三个字符组合而成。可抽象如下函数:

function generBase(num,arr){
  var result="";
  if(num>=1&&num<=3){
    result=repeatC(arr[0],num);
  }
  if(num===4){
    result=arr[0]+''+arr[1];
  }
  if(num>=5&&num<=8){
    result=arr[1]+''+repeatC(arr[0],num-5);
  }
  if(num===9){
    result=arr[0]+""+arr[2];
  }
  return result;
}

三、转换为罗马数字

      转换函数需要对任意输入的数字n做出判断,通过不断的取余分别对不同的数字位做出相应的处理,转换函数如下:

function convert(num) {
  var result="";
  if(num>=1000){
    result=repeatC('M',Math.floor(num/1000));
    num %= 1000;
  }
  if(num>=100){
    result+=generBase(Math.floor(num/100),['C','D','M']);
    num %= 100;
  }
  if(num>=10){
    result+=generBase(Math.floor(num/10),['X','L','C']);
    num %= 10;
  }
  if(num>=1){
    result+=generBase(Math.floor(num),['I','V','X']);
  }
  return result;
}

示例:convert(2953);

运行结果为:MMCMLIII;

转载于:https://my.oschina.net/flyyourdream/blog/860489

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值