罗马数字转阿拉伯数字两种实现
记数方法
基本字符 |
I |
V |
X |
L |
C |
D |
M |
---|---|---|---|---|---|---|---|
相应的阿拉伯数字表示为 |
1 |
5 |
10 |
50 |
100 |
500 |
1000 |
相同的数字连写,所表示的数等于这些数字相加得到的数,如:Ⅲ=3;
小的数字在大的数字的右边,所表示的数等于这些数字相加得到的数, 如:Ⅷ=8、Ⅻ=12;
小的数字(限于 I、X 和 C)在大的数字的左边,所表示的数等于大数减小数得到的数,如:Ⅳ=4、Ⅸ=9;
正常使用时,连写的数字重复不得超过三次;
在一个数的上面画一条横线,表示这个数扩大 1000 倍。
组数规则
有两条须注意掌握:
基本数字 Ⅰ、X 、C 中的任何一个,自身连用构成数目,或者放在大数的右边连用构成数目,都不能超过三个;放在大数的左边只能用一个;
不能把基本数字 V 、L 、D 中的任何一个作为小数放在大数的左边采用相减的方法构成数目;放在大数的右边采用相加的方式构成数目,只能使用一个。
对照举例
个位数举例
Ⅰ-1、Ⅱ-2、Ⅲ-3、Ⅳ-4、Ⅴ-5、Ⅵ-6、Ⅶ-7、Ⅷ-8、Ⅸ-9
十位数举例
百位数举例
千位数举例
实现举例
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <strings.h>//罗马数字转阿拉伯数字
char stdname[] = {'I','V','X','L','C','D','M'};
int stdval[] = {1,5,10,50,100,500,1000};//根据阿拉数字获取stdname的下标
int L(char c){for(int i=0;i<sizeof(stdname);i++){if(c == stdname[i])return i;}printf("L() function input error!\n");return -1;
}//根据当前位置后面的字符判断加减本值
int wich_dir(char *ptr,int len){char c = *(char *)ptr;char *p = (char *)ptr;while(len-->0){if(L(*p) > L(c)){return 0;}p++;}return 1;
}//主函数
int main(int argc,char ** argv){if(argc != 2){printf("参数必填\n");return 1;}int len = strlen(argv[1]);int result = 0 ;int i = 0;int dir = 1;char * start = (char *)argv[1];do{dir = wich_dir((char *)start,len); int index = L(*(char *)start);if(dir) result += stdval[index];else result -= stdval[index];start++;}while(--len>0);printf("result=%d\n",result);return 0;
}
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <strings.h>//罗马数字转阿拉伯数字
char stdname[] = {'I','V','X','L','C','D','M'};
int stdval[] = {1,5,10,50,100,500,1000};//根据阿拉数字获取stdname的下标
int L(char c){for(int i=0;i<sizeof(stdname);i++){if(c == stdname[i])return i;}printf("L() function input error!\n");return -1;
}//根据当前位置后面的字符判断加减本值
int wich_dir(char *origin ,char *ptr){char c = *(char *)ptr;char *p = (char *)ptr;while(origin >= p){if(L(*p) > L(c)){return 0;}p++;}return 1;
}//主函数
int main(int argc,char ** argv){if(argc != 2){printf("参数必填\n");return 1;}char * deduct_ptr = argv[1];int len = strlen(argv[1]);deduct_ptr += len - 1;int result = 0 ;int i = 0;int dir = 1;char * start = (char *)argv[1]+len-1;do{dir = wich_dir(start,(char *)deduct_ptr); if(dir) result += stdval[L(*(char *)deduct_ptr)];else result -= stdval[L(*(char *)deduct_ptr)];deduct_ptr--;}while(--len>0);printf("result=%d\n",result);return 0;
}
罗马数字转阿拉伯数字两种实现相关推荐
- 罗马数字包含以下七种字符: I, V, X, L,C,D 和 M。例如, 罗马数字 2 写做 II ,即为两个并列的 1
罗马数字包含以下七种字符: I, V, X, L,C,D 和 M. 字符 数值 I 1 V 5 X 10 L 50 C 100 D 500 M 1000 例如, 罗马数字 2 写做 II ,即为两个并 ...
- 罗马数字与阿拉伯数字的相互转换
最近遇到一道非常有趣的题目,题目大意如下:有一个富翁在银河系里做生意,而银河系使用的是罗马数字,所以他需要一个精明能干的助手,帮助他完成罗马数字与阿拉伯数字的相互转换,题目在这个背景下衍生出交易场 ...
- python罗马数字转换阿拉伯数字_20202427-张启辰《Python3初学:罗马数字转阿拉伯数字》...
20202427-张启辰<Python3初学:罗马数字转阿拉伯数字> 1.规则 罗马数字是古罗马使用的一种记数系统,在阿拉伯数字传入之前使用较为普遍,目前大家可能在钟表.日历.文章的排序 ...
- 罗马数字和阿拉伯数字之间的转换
问题描述:把我们常见的阿拉伯数字转化为罗马数字的形式. 拓展:两种形式的相互转换. 思路:将阿拉伯数字拆分为能够被罗马数字整除的形式(比如100.500等),再整合到一起,然后替换字符为我们需要的形式 ...
- 罗马数字与阿拉伯数字互转
来源于 LeetCode Roman to Integer 描述: Given a roman numeral, convert it to an integer. Input is guarante ...
- 罗马数字转换的几种方法 python123平台
罗马数字转换的几种方法 python123平台 题目要求: 将一个罗马数字转换成十进制整数输出,其中,罗马数字的范围为1~3999. ...
- Word设置两种页码
设置两种页码 word 写毕业论文遇到一问题,开始的引言和目录的部分用罗马数字的Ⅰ.Ⅱ.Ⅲ标页码,然后正文的部分用阿拉伯数字从1.2.3.4开始标 把光标定位在需要使用阿拉伯数字作为页码格式的那一页: ...
- leetcode:13、罗马数字包含以下七种字符: I, V, X, L,C,D 和 M。
一.题目:13.罗马数字包含以下七种字符: I, V, X, L,C,D 和 M.题目链接 字符 数值 I 1 V 5 X 10 L 50 C 100 D 500 M 1000 例如, 罗马数字 2 ...
- 罗马数字包含以下七种字符: I, V, X, L,C,D 和 M。 字符 数值 I 1 V 5 X 10 L
罗马数字包含以下七种字符: I, V, X, L,C,D 和 M. 字符 数值 I 1 V 5 X 10 L ...
最新文章
- 计算机视觉一些项目实战技术(续)
- python数据框 命名_Python-根据列值将数据框分为多个数据框,并用这些值命名 - python...
- java 上下文加载器_如何将JDK6 ToolProvider和JavaCompiler与上下文类加载器一起使用?...
- 鸿蒙系统太烂,一加终于觉醒!变相承认系统太烂,魅族的吐槽一针见血
- mysql管理器源码_一个HelloWorld版的MySQL数据库管理器的设计与实现(源码)
- 通信与计算机技术的联系,通信技术与计算机技术融合发展论文
- 1.7 编程基础之字符串 14 大小写字母互换 python
- kubernetes怎么读_Kubernetes之有状态应用实践-搭建MySQL集群
- linux下的C语言开发(静态库)
- 在职场想要涨薪升职,需要打造个人品牌
- php preserve keys,PHP常用的数组函数
- 数据分析和数据挖掘相关模块
- 电脑指定区域旋转_诸城全自动旋转门批发,医用病房门,请看
- C语言: 输出一个图形
- python数字字母识别_字符图像识别——数字字母混合
- 【虚幻引擎4(UE4)实用技巧】-关于高亮显示物体轮廓线
- 6-6 采用邻接表创建无向图
- 设置centos7.3的YUM源为国内阿里云源
- 我的世界Java版最大村庄_我的世界:java版完美种子,开局两村庄齐铁套
- 利用mininet进行链路拥塞造成数据丢包的实验