• Leetcode:integer_to_roman


    一、     题目

       将给定的数字(阿拉伯数字)转化成罗马数字。

    数字不会大于3999

    二、     分析

       首先我们要知道神马是罗马数字,尽管听说过。但事实上我还真没有记住,于是就google了下,具体见下:

    个位数举例

    I, 1 】II, 2】 III, 3】 IV, 4 】V, 5 】VI, 6】 VII, 7】 VIII,8 】IX, 9

    十位数举例

      X, 10】 XI, 11 】XII, 12】 XIII, 13】 XIV, 14】 XV, 15 】XVI, 16 】XVII, 17 】XVIII, 18】 XIX, 19】 XX, 20】  XXI, 21 】XXII, 22 】XXIX, 29】 XXX, 30】 XXXIV, 34】 XXXV, 35 】XXXIX, 39】 XL, 40】 L, 50 】LI, 51】 LV, 55】 LX, 60】 LXV, 65】 LXXX, 80】 XC, 90 】XCIII, 93】 XCV, 95 】XCVIII, 98】 XCIX, 99 】

    百位数举例

    C, 100】 CC, 200 】CCC, 300 】CD, 400】 D, 500 】DC,600 】DCC, 700】 DCCC, 800 】CM, 900】 CMXCIX,999】

    千位数举例

    M, 1000】 MC, 1100 】MCD, 1400 】MD, 1500 】MDC, 1600 】MDCLXVI, 1666】MDCCCLXXXVIII, 1888 】MDCCCXCIX, 1899 】MCM, 1900 】MCMLXXVI,1976】 MCMLXXXIV, 1984】 MCMXC, 1990 】MM, 2000 】MMMCMXCIX, 3999】

    正好有我们要求的最大数。

          于是我们能够想到,我们仅仅须要将数字与上面的数字相应就可以。

    1.     首先。我们要先确定高位即千位的数字,即推断到底是1000还是2000还是3000。于是能够想到每次将num减去1000。并加上一个”M”。

    2.     然后,我们推断百位的数字。即能够用num/100来得到百位的数字

    3.     再次就是十位和个位,同2的做法

    将每个位的字母从左到右连接在一起即构成了我们的结果。

    另外,在CSDN上看到一个童鞋的方法非常好

    I = 1;

    V = 5;

    X = 10;

    L = 50;

    C = 100;

    D = 500;

    M = 1000;

    当中每两个阶段的之间有一个减法的表示,比方900=CM, C写在M前面表示M-C。范围给到3999,情况不多直接打表事实上更快。用代码推断表示预计比較繁琐。

    然后就是贪心的做法,每次选择能表示的最大值,把相应的字符串连起来。


    class Solution {
    public:
        string intToRoman(int num) {
            string str;
    		char *hu[] = {"","C","CC","CCC","CD","D","DC","DCC","DCCC","CM"};
    		char *te[] = {"","X","XX","XXX","XL","L","LX","LXX","LXXX","XC"};
    		char *on[] = {"","I","II","III","IV","V","VI","VII","VIII","IX"};
    		
    		while(num>=1000) {
    			str+="M";
    			num-=1000;
    		}
    		str += hu[num/100];
    		num=num%100;
    		str += te[num/10];
    		num=num%10;
    		str+=on[num];
    		return str; 
        }
    };
    
    法2:
    class Solution {
    public:
        string intToRoman(int num) {
            string str;  
            string symbol[]={"M","CM","D","CD","C","XC","L","XL","X","IX","V","IV","I"};  
            int value[]=    {1000,900,500,400, 100, 90,  50, 40,  10, 9,   5,  4,   1}; 
            for(int i=0;num!=0;++i)
            {
                while(num>=value[i])
                {
                    num-=value[i];
                    str+=symbol[i];
                }
            }
            return str;
        }
    }; 
    
    法3:JAVA
    class Solution {
    public:
        string intToRoman(int num) {
            int[] values = {1000, 900, 500, 400, 100,90, 50, 40, 10, 9, 5, 4, 1 };
            String[] numerals = {"M", "CM", "D", "CD", "C", "XC", "L", "XL", "X", "IX", "V", "IV", "I" };
            StringBuilder result = new StringBuilder();
            for (int i = 0; i < values.length; i++) {
                while (number >= values[i]) {
                    number -= values[i];
                    result.append(numerals[i]);
                }
            }
            return result.toString();
        }
    };
    


  • 相关阅读:
    【训练】9.13 训练赛
    【训练】9.12 训练赛
    【题录】CF#666 Div.2
    【题解】JSOI2009球队收益 / 球队预算
    【申明】——暂别博客园——
    【题解】CF#896 D-Nephren Runs a Cinema
    【题解】洛谷P4707重返现世
    [HNOI2012][BZOJ2732] 射箭 [二分+半平面交]
    平面几何-学习笔记
    [NOI.AC省选模拟赛3.31] 星辰大海 [半平面交]
  • 原文地址:https://www.cnblogs.com/lytwajue/p/7261294.html
Copyright © 2020-2023  润新知