zoukankan      html  css  js  c++  java
  • 罗马数字和整数相互转换

    整数转换成罗马数字:

    罗马数字的基本型为:I=1,V=5,X=10,L=50,C=100,D=500,M=1000,相同的罗马数字最多不能超过三个。所以对于4只能表示为5-1即IV,左减右加。

    同理,9=IX,40=XL,90=XC,400=CD,900=CM。根据这些基本型,可以通过贪心算法,每次匹配最大值得到罗马数字.

         //整数转化成罗马数字
        //贪心算法,每次取匹配最大值
        public static String intToRoman(int number) {
            int[] base = { 1000, 900, 500, 400, 100, 90, 50, 40, 10, 9, 5, 4, 1 };
            String[] str = { "M", "CM", "D", "CD", "C", "XC", "L", "XL", "X", "IX",
                    "V", "IV", "I" };
            String roman = "";
            int i = 0;
            while (number != 0) {
                if (number >= base[i]) {
                    number -= base[i];
                    roman += str[i];
                } else
                    i++;
            }
            return roman;
        }

    罗马数字转换成整数:

    首先要来了解一下罗马数字表示法,基本字符有7个:I,V,X,L,C,D,M,分别表示1,5,10,50,100,500,1000。

    在构成数字的时候,有下列规则:

    1、相同的数字连写,所表示的数等于这些数字相加得到的数,如:Ⅲ = 3;

    2、小的数字在大的数字的右边,所表示的数等于这些数字相加得到的数, 如:Ⅷ = 8;Ⅻ = 12;

    3、小的数字,(限于Ⅰ、X 和C)在大的数字的左边,所表示的数等于大数减小数得到的数,如:Ⅳ= 4;Ⅸ= 9;

    4、正常使用时,连写的数字重复不得超过三次。

        //罗马数字转化成整数
        public static int romanToInt(String s) {
            if (s.length() < 1)
                return 0;
            int result = 0;
            int sub = getRomanValue(s.charAt(0));
            int lastv = sub;
            for (int i = 1; i < s.length(); ++i) {
                char curc = s.charAt(i);
                int curv = getRomanValue(curc);
                if (curv == lastv)
                    sub += curv;
                // 当前一个字符大于当前字符时,情况比较特殊,这个时候,只能讲last包括last的字符算在sub内,相加得到result,
                // 至于curr还需要根据curr后面的字符判断
                else if (curv < lastv) {
                    result += sub;
                    sub = curv;
                } else {
                    sub = curv - sub;
                }
                lastv = curv;
            }
            result += sub;
            return result;
        }
    
        public static int getRomanValue1(char c) {
            Map<Character, Integer> map = new HashMap<>();
            map.put('I', 1);
            map.put('V', 5);
            map.put('X', 10);
            map.put('L', 50);
            map.put('C', 100);
            map.put('D', 500);
            map.put('M', 1000);
            return map.get(c);
    
        }
    
        public static int getRomanValue(char c) {
            switch (c) {
            case 'I':
                return 1;
            case 'V':
                return 5;
            case 'X':
                return 10;
            case 'L':
                return 50;
            case 'C':
                return 100;
            case 'D':
                return 500;
            case 'M':
                return 1000;
            default:
                return 0;
            }
        }
  • 相关阅读:
    Dsl学习笔记-3
    Dsl学习笔记-2
    Dsl学习笔记-1
    多线程学习笔记
    DataGrid研究笔记-3
    DataGrid研究笔记-2
    从基础到分析,聊一聊企业报表平台的建设规划!
    深度解读|数据化管理的四个层次
    干货:实现数据可视化的几个工具选择(工具+编程语言)
    案例分享|某医药集团的BI建设案例
  • 原文地址:https://www.cnblogs.com/masterlibin/p/5531399.html
Copyright © 2011-2022 走看看