罗马数字和阿拉伯数字互转 - litonghui/TechBlog GitHub Wiki

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

一,罗马数字: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,区间可以分为:<4,4 ,>4&&<9,9 这四个区间,只需要 I 和 V 两个字符表示,同理10--90 中10的整数倍也只需要 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;
}
⚠️ **GitHub.com Fallback** ⚠️