欢迎访问 生活随笔!

生活随笔

当前位置: 首页 > 编程资源 > 编程问答 >内容正文

编程问答

罗马数字转阿拉伯数字两种实现

发布时间:2023/12/14 编程问答 42 豆豆
生活随笔 收集整理的这篇文章主要介绍了 罗马数字转阿拉伯数字两种实现 小编觉得挺不错的,现在分享给大家,帮大家做个参考.

记数方法

古罗马数字基本符号

基本字符

相应的阿拉伯数字表示为

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

    十位数举例

    Ⅹ-10、Ⅺ-11、Ⅻ-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、XLV-45、XLIX(IL)-49、L-50、LI-51、LV-55、LX-60、LXV-65、LXXX-80、XC-90、XCIII-93、XCV-95、XCVIII-98、XCIX(IC)-99

    百位数举例

    C-100、CC-200、CCC-300、CD-400、CDXC(XD)-490、CDXCV-495、CDXCIX-499、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(MDCCCIC)-1899、MCM-1900、MCMLXXVI-1976、MCMLXXXIV-1984、MCMXC(MXM)-1990、MM-2000、MMMCMXCIX(MMMIM)-3999

    实现举例

    1.正序加减法

    #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; }

    2.倒叙加减法

    #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; }

    总结

    以上是生活随笔为你收集整理的罗马数字转阿拉伯数字两种实现的全部内容,希望文章能够帮你解决所遇到的问题。

    如果觉得生活随笔网站内容还不错,欢迎将生活随笔推荐给好友。