zoukankan      html  css  js  c++  java
  • Javascript--将十进制数字转换成罗马数字显示

      下午在FCC(FreeCodeCamp)中文网上做到一道练习题:将给定的数字转换成罗马数字。折磨了一个多小时,终于能把基本功能给实现了。过程如下:

    关于罗马数字

      罗马数字的详细介绍可见百度,或者罗马数字。这里作一下简单的介绍(图片选自罗马数字):

    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。

     1 function convert(num) {
     2     var newArr = [];
     3     var newStr;
     4     //先把数字转化为相应的罗马字母
     5     while(num > 0) {
     6         if(num - 1000 >= 0) {
     7             newArr.push('M');
     8             num -= 1000;
     9         } else if (num - 500 >= 0) {
    10             newArr.push('D');
    11             num -= 500;
    12         } else if (num - 100 >= 0) {
    13             newArr.push('C');
    14             num -= 100;
    15         } else if (num - 50 >= 0) {
    16             newArr.push('L');
    17             num -= 50;
    18         } else if(num - 10 >= 0) {
    19             newArr.push('X');
    20             num -= 10;
    21         } else if(num - 5 >= 0) {
    22             newArr.push('V');
    23             num -= 5;
    24         } else if(num - 1 >= 0) {
    25             newArr.push('I');
    26             num -= 1;
    27         }
    28     }
    29     newStr = newArr.join('');
    30     //将4和9的情况进行替换
    31     newStr = newStr.replace(/VI{4}|LX{4}|DC{4}|I{4}|X{4}|C{4}/g, function(match) {
    32         switch(match) {
    33             case 'VIIII':
    34                 return "IX";
    35             case 'LXXXX':
    36                 return "XC";
    37             case 'DCCCC':
    38                 return "CM";
    39             case 'IIII':
    40                 return "IV";
    41             case 'XXXX':
    42                 return "XL";
    43             case 'CCCC':
    44                 return "CD";  
    45         }
    46     });
    47     return newStr;
    48 }

     测试部分数字:

    console.log(convert(3999));    // MMMCMXCIX
    console.log(convert(3444));    // MMMCDXLIV
    console.log(convert(1234));   // MCCXXXIV 
    console.log(convert(83));    // LXXXIII 
    console.log(convert(123));   // CXXIII

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

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

  • 相关阅读:
    SD卡性能测试
    在程序内动态获取svn版本号
    在SharePoint 2010程序中使用Session
    图片预读
    CSS图片垂直居中方法整理集合 !(常见问题解答)
    cpld的入门交流之二:秒信号发生器
    基于json数据的jQuery无限级下拉菜单插件
    MySQL 按指定字段自定义列表排序
    10张图让你更了解博客
    IE6 CSS bug: position:relative变成了absolute
  • 原文地址:https://www.cnblogs.com/alicell/p/9179246.html
Copyright © 2011-2022 走看看