zoukankan      html  css  js  c++  java
  • lintcode :Integer to Roman 整数转罗马数字

    题目

    给定一个整数,将其转换成罗马数字。

    返回的结果要求在1-3999的范围内。

    样例

    4 -> IV

    12 -> XII

    21 -> XXI

    99 -> XCIX

    更多案例,请戳 http://literacy.kent.edu/Minigrants/Cinci/romanchart.htm

    说明

    什么是 罗马数字?

    解题

     拼写规则

    罗马数字共有7个,即I(1)、V(5)、X(10)、L(50)、C(100)、D(500)和M(1000)。按照下述的规则可以表示任意正整数。需要注意的是罗马数字中没有“0”,与进位制无关。一般认为罗马数字只用来记数,而不作演算。
    重复数次:一个罗马数字重复几次,就表示这个数的几倍。
    右加左减:
    在较大的罗马数字的右边记上较小的罗马数字,表示大数字加小数字。
    在较大的罗马数字的左边记上较小的罗马数字,表示大数字减小数字。
    左减的数字有限制,仅限于I、X、C。比如45不可以写成VL,只能是XLV
    但是,左减时不可跨越一个位数。比如,99不可以用IC(100-1)表示,而是用XCIX(100-10  10 -1)表示。(等同于阿拉伯数字每位数字分别表示。)
    左减数字必须为一位,比如8写成VIII,而非IIX。
    右加数字不可连续超过三位,比如14写成XIV,而非XIIII。 
    加线乘千:
    在罗马数字的上方加上一条横线或者加上下标的Ⅿ,表示将这个数乘以1000,即是原数的1000倍。
    同理,如果上方有两条横线,即是原数的1000000 倍。
    数码限制:
    同一数码最多只能连续出现三次,如40不可表示为XXXX,而要表示为XL。
    例外:由于IV是古罗马神话主神朱庇特(即IVPITER,古罗马字母里没有J和U)的首字,因此有时用IIII代替IV。 
    根据上面规则,为了防止出现高于三次的字符,对高于三次的基本字符进行先处理
     
    I IV IX X XL L XC C CD D CM M
    1 4 5 9 10 40 50 90 100 500 900 1000

    这样对任一个罗马数字可以 由上面的12个字符进行加法操作完成,即:大数在左,小数在右。《具体为什么,我不是很理解,类似于人民币只有:100,50,20,10,5,2,1,0.5,0.2,0.1可以组成任意金额》

    下面程序虽然很差,但是很好理解

    public class Solution {
        /**
         * @param n The integer
         * @return Roman representation
         */
        public String intToRoman(int n) {
            // Write your code here
            if(n<1 || n>3999)
                return "ERROR";
            String  s="";
            while(n>=1000){
                s += "M";
                n -= 1000;
            }
            while(n >= 900){
                s += "CM";
                n -= 900;
            }
            while( n>= 500){
                s += "D";
                n -= 500;
            }
            while( n>= 400){
                s += "CD";
                n -= 400;
            }
            while( n >= 100){
                s += "C";
                n -= 100;
            }
            while( n>= 90){
                s += "XC";
                n -= 90;
            }
            while( n>= 50){
                s += "L";
                n -= 50;
            }
            while( n >= 40){
                s += "XL";
                n -= 40;
            }
            while( n>= 10){
                s += "X";
                n -= 10;
            }
            while( n>= 9){
                s +="IX";
                n -= 9;
            }
            while( n>=5 ){
                s += "V";
                n -= 5;
            }
            while( n >= 4 ){
                s +="IV";
                n -= 4;
            }
            while(n >= 1 ){
                s +="I";
                n -= 1;
            }
            return s;
        }
    }
    Java Code

    然后可以改写成下面的形式

    public class Solution {
        /**
         * @param n The integer
         * @return Roman representation
         */
        public String intToRoman(int n) {
            // Write your code here
            int[] numbers = { 1000,  900,  500,  400,  100,   90,  50,   40,   10,    9,    5,    4, 1 };
    
            String[] letters = { "M",  "CM",  "D",  "CD", "C",  "XC", "L",  "XL",  "X",  "IX", "V",  "IV", "I" };
            String res ="" ;
            for(int i = 0;i<13;i++){
                if(n >= numbers[i]){
                    int count = n/numbers[i];
                    n = n%numbers[i];
                    for(int j=0;j<count ;j++){
                        res= res + letters[i];
                    }
                }
            }
            return res;
    }
    }
    Java Code

    Python程序也是很简单

    class Solution:
        # @param {int} n The integer
        # @return {string} Roman representation
        def intToRoman(self, n):
            # Write your code here
            numbers = [1000,900,500,400,100,90,50,40,10,9,5,4,1]
            letters = ["M","CM","D","CD","C","XC","L","XL","X","IX","V","IV","I"]
            res =[]
            for i in range(13):
                if n>= numbers[i]:
                    count = n/numbers[i]
                    n %= numbers[i]
                    res += letters[i]*count
            return "".join(res) 
    Python Code

    参考链接

  • 相关阅读:
    Minimum Depth of Binary Tree leetcode java
    Maximum Depth of Binary Tree leetcode java
    Symmetric Tree leetcode java
    Same Tree leetcode java
    Binary Tree Postorder Traversal leetcode java
    Binary Tree Preorder Traversal leetcode java
    Binary Tree Inorder Traversal leetcode java
    Combinations leetcode java
    一键清除Centos iptables 防火墙所有规则
    阿里云centos7.7x64安装open,并配置ip转发和nat伪装
  • 原文地址:https://www.cnblogs.com/bbbblog/p/4957173.html
Copyright © 2011-2022 走看看