博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
罗马数字与阿拉伯数字的相互转化
阅读量:2425 次
发布时间:2019-05-10

本文共 2527 字,大约阅读时间需要 8 分钟。

题目

1

Given an integer, convert it to a roman numeral.

Input is guaranteed to be within the range from 1 to 3999.

2

Given a roman numeral, convert it to an integer.

Input is guaranteed to be within the range from 1 to 3999.

这两道题就是要我们在1~3999(为什么小于4000呢?)的范围内将用阿拉伯数字表示的整数与用罗马数字表示的数相互转换。

罗马数字

在将这两者转化之前,我们需要先了解一下罗马数字及其规则。

(罗马数字的起源,变化以及发展跟我们的主题无关,想要知道的自己上网查找。)

罗马数字一共有7个基本符号,分别为:I(1)、V(5)、X(10)、L(50)、C(100)、D(500)和M(1000),括号内的值表示其大小。注意:罗马数字并没有表示0的符号。

规则

1. 相同的数字连写、所表示的数等于这些数字相加得到的数。 如 III表示 3,XX表示20。但是,一般情况下,连写不能超过3次,V、L和D不能连写。

2. 小的数字在大的数字的右边,所表示的数等于这些数字相加得到的数。 如 VI 表示 6。

3. 小的数字在大的数字的左边,所表示的数等于大数减小数得到的数。 如 IX 表示 9, CD表示400。但是,这个仅限于I在V或者X的左边, X在L或C的左边,C在D或M的左边。例如99表示成 XCIX,不能表示为 IC。而且左减数字只能为一位。例如8表示成VII,不能表示成IIX。

4. 在一个数的上面画一条横线、表示这个数扩大 1000 倍。(由于在这两道题目中,无法表示出来,因此最大只能表示3999,要表示5000就只能在V上面加上横线)。

个人理解

看了上面的规则后,其实有些人对于罗马数字的表示还可能云里雾里的。如果你把IV(4), IX(9), XL(40),XC(90),CD(400),CM(900)看成一个数字。在将一个数表示成罗马数字的时候,按照从左到右的写法,从大到小选择罗马数字符号就可以了。

例如,748 =》 DCC(700) + XL(40) + VIII =》 DCCXLVIII

           999 =》 CM(900) + XC(90) + IX =》 CMXCIX

代码

在int->roman中,我用一个表存储十进制数上每个位上的数字对应的罗马数字。在转换的时候,只要求解出每个位置上的数字,再查表后将得到的字符连接起来就可以得出结果。

在roman->int中,用一个int类型的变量表示罗马数字代表的值,若使用查表的方法需要先对字符串进行分割,有点麻烦,直接利用规则2和规则3,若字符str[i]表示的值小于字符str[i+1]表示的值,就减去str[i]的值,否则加上str[i+1]的值。

#include
class Solution {public: string intToRoman(int num) { // table表存储十进制数上每个位所表示的罗马数字 // 例如, 365 中 百位上的 3 大小为 table[2][3] = CCC string table[4][10] = { {"", "I", "II", "III", "IV", "V", "VI", "VII", "VIII", "IX"}, {"", "X", "XX", "XXX", "XL", "L", "LX", "LXX", "LXXX", "XC"}, {"", "C", "CC", "CCC", "CD", "D", "DC", "DCC", "DCCC", "CM"}, {"", "M", "MM", "MMM", "", "", "", "", "", ""} }; string roman_numeral = ""; roman_numeral += table[3][num / 1000]; num %= 1000; roman_numeral += table[2][num / 100]; num %= 100; roman_numeral += table[1][num / 10]; num %= 10; roman_numeral += table[0][num]; return roman_numeral; }};#include
class Solution {public: int romanToInt(string s) { map
mymap = { {'I', 1}, {'V', 5}, {'X', 10}, {'L', 50}, {'C', 100}, {'D', 500}, {'M', 1000} }; int result = 0, i = 0, temp; for (i = 0; i < s.length() - 1; i++) { temp = mymap[s[i]]; if (temp < mymap[s[i + 1]]) { result -= temp; } else { result += temp; } } result += mymap[s[i]]; return result; }};

转载地址:http://xibmb.baihongyu.com/

你可能感兴趣的文章
来华30载,这些都是Oracle的神来之笔……
查看>>
Kubernetes要成为一个企业友好平台,到底还缺啥?
查看>>
云数据库精华问答 | 云数据库与其他数据库的关系
查看>>
美国专利机构榜单:华为、京东方进前20名;印度巨头信实与微软结盟;三星发布 1.08 亿像素传感器,小米参与合作……...
查看>>
5G基站功耗,到底有多大?
查看>>
行!这下 CSDN 玩大了!粉丝:太良心
查看>>
Spark精华问答 | 怎么运行Spark?
查看>>
百度积极回应阿波龙项目不实报道;半数开发者认为学习新语言很困难;腾讯在长沙建立首个智慧产业总部……...
查看>>
数据中台与苏秦挂六国相印
查看>>
苹果遭集体诉讼;华为或年底推出鸿蒙系统中低端智能手机;Facebook雇人记录用户语音通话以改善AI技术……...
查看>>
云化要求下,数据库架构如何演进?
查看>>
5G精华问答 | 5G关键技术解读
查看>>
10个业界最流行的Kubernetes发行版
查看>>
微软发布 Azure 物联网安全中心;阿里巴巴在美申请专利,以实现跨区块链统一管理;Google利用足球训练下一代人工智能……...
查看>>
如何证明你不是在开发垃圾?
查看>>
微服务精华问答 | 为什么需要微服务?
查看>>
当我们谈AI时,到底该谈什么?
查看>>
kafka系统设计开篇
查看>>
2019全球编程语言高薪排行榜登场;余承东正式宣布华为IFA2019 或发布麒麟990;OPPO、vivo和小米成立互传联盟…...
查看>>
虚拟化精华问答 | 虚拟化技术分类
查看>>