古罗马帝国开创了辉煌的人类文明,但他们的数字表示法的确有些繁琐,尤其在表示大数的时候,现在看起来简直不能忍受,所以在现代很少使用了。之所以这样,不是因为发明表示法的人的智力的问题,而是因为一个宗教的原因,当时的宗教禁止在数字中出现 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;
}