1.罗马数字的计数规则
罗马数字共有7个 I(1) ,V(5),X(10),C(100),D(500),M(1000)。
a、重复数次:
一个罗马数字重复几次,就表示这个数的几倍。比如: III表示3,XXX表示30。 同一数码最多只能出现三次,如40不可表示为XXXX,而要表示为XL。
例外:由于IV是古罗马神话主神朱庇特(即IVPITER,古罗马字母里没有J和U)的首字,因此有时用IIII代替Ⅳ。

b、右加左减:
在较大的罗马数字的右边记上较小的罗马数字,表示大数字加小数字。在较大的罗马数字的左边记上较小的罗马数字,表示大数字减小数字。比如:VI表示6,IV表示4

c、 左减的数字有限制:
仅限于I、X、C。比如95不可以写成VC,只能是XCV。
左减时不可跨越一个位数(即十的指数相差大小为一)。比如,99不可以用IC(100 - 1)表示,而是用XCIX([100 - 10] + [10 - 1])表示。(等同于阿拉伯数字每位数字分别表示)
左减数字必须为一位,比如8写成VIII,而非IIX。

d、右加数字限制:
不可连续超过三位,比如14写成XIV,而非XIIII。

e、加线乘千:
在罗马数字的上方加上一条横线表示将这个数乘以1000,即是原数的1000倍。
同理,如果上方有两条横线,即是原数的1000000(1000^{2})倍。

2. 代码实现

2.1 将罗马数字转换成十进制数字

int romanToInt(char * s){int count = 0;while (*s){if (*s == 'V')         count += 5;else if (*s == 'L')    count += 50;else if (*s == 'D')    count += 500;else if (*s == 'M')    count += 1000; //采用规则,做减法时候数字左边只能是I,X,C;else if (*s == 'I') count = (*(s + 1) == 'V' || *(s + 1) == 'X') ? count - 1 : count + 1;else if (*s == 'X')count = (*(s + 1) == 'L' || *(s + 1) == 'C') ? count - 10 : count + 10;elsecount = (*(s + 1) == 'D' || *(s + 1) == 'M') ? count - 100 : count + 100;    //当左边是I,X,C时候判断是是否存在减去这个数的情况s++;}return count;
}

上述代码将罗马数字从左向右转换成十进制数字。

2.2 将十进制转换成罗马数字

char* intToRoman(int num) {int numIndex = 0;int strIndex = 0;char* result = (char*)malloc(sizeof(char) * 20);int nums[] = { 1000, 900 , 500, 400, 100,  90,  50, 40, 10, 9 ,5 , 4 , 1 };char rom[][12] = { "M", "CM", "D", "CD", "C", "XC", "L", "XL", "X", "IX", "V", "IV", "I" };while (num != 0) {if (num >= nums[numIndex]) {memcpy(result + strIndex, rom[numIndex], strlen(rom[numIndex]));//将罗马数字放在指针所指向的位置strIndex += strlen(rom[numIndex]);//指针向后移动num -= nums[numIndex]; //数字减去已经存方的罗马数字}else {numIndex++;}}*(result + strIndex) = '\0';return result;
}

上述代码是将数字转换成罗马数字存放的算法,实际使用中针对数字比较小的十进制数

罗马数字的计数规则和算法实现罗马数字和十进制的相互转换相关推荐

  1. python - 算法 - 简单 - 罗马数字转换

    世界上并没有完美的程序,但是我们并不因此而沮丧,因为写程序就是一个不断追求完美的过程. -侯氏工坊 文章目录 题目 思路 实现 题目 [罗马数字转换] 罗马数字包含以下七种字符:I,V,X,L,C,D ...

  2. 强化学习之基于伪计数的探索算法

    ©作者|王治海 学校|中国科学技术大学硕士生 研究方向|强化学习与机器博弈 强化学习基于智能体与环境的交互,以最大化累积奖励为目标,学习状态到动作的映射(即策略).本文将主要围绕强化学习中的探索问题展 ...

  3. 计算机应用研究潜规则,基于相容矩阵计算的不完备决策系统规则获取算法

    基于相容矩阵计算的不完备决策系统规则获取算法 针对不完备信息决策系统问题,引入相容关系下条件属性矩阵和决策属性矩阵的相关概念,并由此提出一种基于矩阵计算的不 (本文共6页) 阅读全文>> ...

  4. j1_12_01.实现手机号计数功能关键算法.传入字符串数组,获取符合手机号格式的字符串.从键盘接收一行字符串,字符串中只包含数字和空格,统计其中所有的手机号码数量。

    import java.util.Scanner;/*** 任务一:实现手机号计数功能关键算法并绘制流程图(30 分) 从键盘接收一行字符串,字符串中只包含数字和空格,统计其中所有的手机号码数量. 比 ...

  5. 2016,解密百度排名规则与算法

    身为一名优秀的SEOer,其实最想掌握的就是百度算法,只有清楚百度算法之后,才能找到快速排名的优化方案.今天给大家深度解析百度算法原理,纯干货,无广告. 收录基本规则        首先,我们都清楚: ...

  6. 银行卡校验规则(Luhn算法)

       当你输入信用卡号码的时候,有没有担心输错了而造成损失呢?其实可以不必这么担心,因为并不是一个随便的信用卡号码都是合法的,它必须通过Luhn算法来验证通过. 该校验的过程: 1.从卡号最后一位数字 ...

  7. 【每日一算法】罗马数字转整数

    微信改版,加星标不迷路! 每日一算法-罗马数字转整数 作者:阿广 阅读目录 1 题目 2 解析 1 题目 罗马数字包含以下七种字符: I, V, X, L,C,D 和 M. 字符 数值I 1 V 5 ...

  8. 【数据结构与算法】之深入解析“整数转罗马数字”的求解思路与算法示例

    一.题目描述 罗马数字包含以下七种字符: I, V, X, L,C,D 和 M: 字符 数值 I 1 V 5 X 10 L 50 C 100 D 500 M 1000 例如, 罗马数字 2 写做 II ...

  9. leetcode 罗马数字与整数的转换算法

    介绍: 该算法是将罗马数字转换为整数,思路如下:比如IXX,使用临时变量temp保存上一个已经遍历的罗马数字,比如:遍历时是从后往前遍历的:1> 刚开始时,temp = 0; 遍历当前遍历到第一 ...

最新文章

  1. MS SQL入门基础:启动与关闭服务器
  2. matlab gui自定义图片做背景,matlab GUI自定义图片做背景
  3. 在同一个Linux上配置多个git账户
  4. marin 初学LINUX之路
  5. 使用matlab内存不足,Matlab内存不足问题(Out of memory)
  6. 前端学习(3092):vue+element今日头条管理-发布更新
  7. html5外置样式表,HTML5移动端通用css详解
  8. .net 动软代码生成器
  9. Microsoft Visual Studio 无法启动程序“路径啪啦啪啦“. 系统找不到指定的文件。
  10. Java文档阅读笔记-JDBC Driver
  11. Java笔记(二)抽象类,接口,完全解耦,多重继承,内部类,静态类,匿名内部类
  12. Java调用Lua脚本(热载实现)
  13. paip.java swt 乱码问题解决
  14. 谷歌地图的级别与对应比例尺及分辨率探究
  15. 将Excel文件数据导入到Oracle
  16. 还在担心找不到驱动程序吗?driveridentifier三步帮你解决所有
  17. css动画-animation各个属性详解
  18. java计算机毕业设计自修室座位预约系统源码+数据库+系统+lw文档+mybatis+运行部署
  19. 爱奇艺连续三年独家直播中网赛事 打造高端体育赛事生态矩阵
  20. RadioButton设置默认选中后无法取消,可选中多个的问题

热门文章

  1. mllib调参 spark_Spark MLlib协同过滤算法
  2. ES6 标签模板与模板字符串
  3. NFC、RFID 天线设计
  4. 北大图形学大牛,低代码实现好莱坞大片特效
  5. 环保餐饮油烟监测在线平台-安科瑞张宇洁
  6. 华为手表,还能评价动脉弹性:北大人民医院孙宁玲等研究
  7. 通过TXT文件如何批量生成商品条码
  8. matlab:线性规划实例编程---采用linprog包
  9. 《J2SE 回炉再造11》-------溺水狗
  10. c语言怎么做12一个月的日历,请问用C语言写日历怎样一行输入三个月啊。我是一个月一个月输入的,不会把二月输入到一月后面,求帮忙...