罗马数字和阿拉伯数字互转

技术文档网 2021-04-25

罗马数字和阿拉伯数字都是两个伟大和神奇的发明,各自代表着先进的文化,它们之间有一定的转换关系,设计一个算法,实现互相转换。

一,罗马数字:I V X L C D M 分别代表 1,5,10,50,100,500,1000 其中表示方法如下:

  罗马数字  阿拉伯数字        计算方法
      I        1              1
      II       2              1+1
      III      3              1+1+1
      IV       4              -1+5
      V        5              5
      VI       6              5+1
      IX       9              -1+10
      X        10             10
      ...      ...            ...

二,阿拉伯数字转罗马数字

    设计一个 char 数组存储罗马字符,char roman[] = {'M', 'D', 'C', 'L', 'X', 'V', 'I'};
    设计一个 int  数组存储罗马字符对应的数字int value[] = {1000, 500, 100, 50, 10, 5, 1};
    分析罗马数字1--9,区间可以分为:<44 ,>4&&<99 这四个区间,只需要 I 和 V 两个字符表示,同理10--9010的整数倍也只需要 L 和 X 两个数表示,个位数借助 I 和 V 表示。
设计代码:(num<3999)
public String intToRoman(int num) {
    String sroman = "";
    char roman[] = {'M', 'D', 'C', 'L', 'X', 'V', 'I'};
    int value[] = {1000, 500, 100, 50, 10, 5, 1};
    int remainder = 0;
    for (int i = 0; i < 7; i += 2) {
        remainder = num / value[i];
        if (remainder < 4) {
            for (int k = 0; k < remainder; k++) {
                sroman += roman[i];
            }
        } else if (remainder == 4) {
            sroman = sroman + roman[i] + roman[i - 1];
        } else if (remainder > 4 && remainder < 9) {
            sroman += roman[i - 1];
            for (int k = 5; k < remainder; k++) {
                sroman += roman[i];
            }
        } else if (remainder == 9) {
            sroman = sroman + roman[i] + roman[i - 2];
        }
        num %= value[i];
    }
    return sroman;
}

二,罗马数字转阿拉伯数字

    分析IV  -1+5 ,IX 为-1+10,可以判断当前I 下一位如果是V 或者是 X,需要变为负数,再加下一位数。同理 V 需要判断下一位是X或者是L,变为负数相加。
代码设计:
public int romanToInt(String sroman) {
    if (sroman == null || sroman.equals("")) {
        return 0;
    }
    char roman[] = {'M', 'D', 'C', 'L', 'X', 'V', 'I'};
    int value[] = {1000, 500, 100, 50, 10, 5, 1};
    int num = 0;
    for (int i = 0; i < sroman.length(); i++) {
        for (int j = 0; j < 7; j++) {
            if (sroman.charAt(i) == roman[j]) {
                if ((i < sroman.length() - 1) && (j >= 2) && (sroman.charAt(i + 1) == roman[j - 2])) {
                    num += -value[j];
                } else if ((i < sroman.length() - 1) && (j >= 1) && (sroman.charAt(i + 1) == roman[j - 1])) {
                    num += -value[j];
                } else {
                    num += value[j];
                }
            }
        }
    }
    return num;
}

相关文章

  1. 硅谷互联网公司的开发流程

    开发流程包括这么几个阶段: OKR 的设立; 主项目及其子项目的确立; 每个子项目的生命周期; 主项目的生命周期; 收尾、维护、复盘。 第一点,OKR 的设立 所有项目的起始,都应该从 Ro

  2. RESTful-表述性状态转移风格

    REST英文全拼:Representational State Transfer 面向资源编程 资源指的就是一类数据 产品表-&gt;就是产品资源 最重要的是如何表示一个资源 地址即

  3. 稳定性思考

    产品功能线 0-1: 当系统从无到有的时候,首要考虑的是研发效率,功能快速迭代,满足快速增长的业务需求 1-10 系统已经搭建起来,此时考虑的是系统的稳定性。 可用性:1.隔离:区分出核心和非核心功能

  4. Supervisor守护队列发邮件

    安装 CentOS: yum -y install supervisor Debien/Ubuntu适用:apt-get install supervisor 配置 修改主配置文件:vim /et

  5. 安装libsodium,让服务器支持chacha20等加密方式

    用chacha20加密方式需要安装libsodium 注意:libsodium从1.0.15开始就废弃了aes-128-ctr yum install wget m2crypto git libsod

随机推荐

  1. 硅谷互联网公司的开发流程

    开发流程包括这么几个阶段: OKR 的设立; 主项目及其子项目的确立; 每个子项目的生命周期; 主项目的生命周期; 收尾、维护、复盘。 第一点,OKR 的设立 所有项目的起始,都应该从 Ro

  2. RESTful-表述性状态转移风格

    REST英文全拼:Representational State Transfer 面向资源编程 资源指的就是一类数据 产品表-&gt;就是产品资源 最重要的是如何表示一个资源 地址即

  3. 稳定性思考

    产品功能线 0-1: 当系统从无到有的时候,首要考虑的是研发效率,功能快速迭代,满足快速增长的业务需求 1-10 系统已经搭建起来,此时考虑的是系统的稳定性。 可用性:1.隔离:区分出核心和非核心功能

  4. Supervisor守护队列发邮件

    安装 CentOS: yum -y install supervisor Debien/Ubuntu适用:apt-get install supervisor 配置 修改主配置文件:vim /et

  5. 安装libsodium,让服务器支持chacha20等加密方式

    用chacha20加密方式需要安装libsodium 注意:libsodium从1.0.15开始就废弃了aes-128-ctr yum install wget m2crypto git libsod