古罗马帝国开创了辉煌的人类文明,但他们的数字表示法的确有些繁琐,尤其在表示大数的时候,现在看起来简直不能忍受,所以在现代很少使用了。之所以这样,不是因为发明表示法的人的智力的问题,而是因为一个宗教的原因,当时的宗教禁止在数字中出现 0 的概念!罗马数字的表示主要依赖以下几个基本符号,如图 8 所示。1000 以内的数字的表示法为:单个符号重复多少次, 就表示多少倍。最多重复 3 次。比如:CCC 表示 300 XX 表示 20,但 150 并不用 LLL 表示,这个规则仅适用于 I X C M。如果相邻级别的大单位在右,小单位在左,表示大单位中扣除小单位。比如:IX 表示 9,IV 表示 4,XL 表示 40 更多的示例参见图 9。由用户输入一个罗马数字串(罗马数字大小不超过 999),程序输出对应的十进制表示。(注:如 LXXX 为 80,XCIII 为 93,DCCII 为702)
代码:
#include <stdio.h> #include <stdlib.h>
/* run this program using the console pauser or add your own getch, system("pause") or input loop */ int ToNum(char ch){ //判断单个字符 switch(ch){ case 'I':{ return 1; break; } case 'V':{ return 5; break; } case 'X':{ return 10; break; } case 'L':{ return 50; break; } case 'C':{ return 100; break; } case 'D':{ return 500; break; } case 'M':{ return 1000; break; } } } int main(int argc, char *argv[]) { printf("输入需要解析的罗马字符:\n"); char input[256]={0}; gets(input); int temp=0; int sum=0; int i=0; //向后看一个 while(input[i+1]&&input[i]){ //连续字符不用管,连续就加就完事了 if(input[i]==input[i+1]){ sum+=ToNum(input[i]); i++; } //不连续字符比大小,左大右小直接加,右大左小需要减(i+=2) if(ToNum(input[i])<ToNum(input[i+1])){ sum+=ToNum(input[i+1])-ToNum(input[i]); i+=2; } else if(ToNum(input[i])>ToNum(input[i+1])){ sum+=ToNum(input[i]); i++; } } //可能存在本身存在,但是后一个字符不存在的情况 if(input[i]&&!input[i+1]){ sum+=ToNum(input[i]); } printf("转换为十进制是:\n%d",sum); return 0; }
