关于100以内的罗马数解析成阿拉伯数

罗马数的解释在这儿。。飞机直达

关于罗马数字的知识


我们知道罗马数由这几个基本的符号表示

I=1,V=5, X=10, L=50 ,C=100, D=500, M=1000


1.如果两个同样的字母连在一起就表示这个数的两倍,三个在一起就表示三倍,例如XX=20,XXX=30


2.如果前面的一个字母表示的阿拉伯数字大于后一个,那么就是前面的一个值加上后面一个值:例如 LX=60,LXX=70,LXXX=80

对于第二个做一个解析,首先L=50,所以现在值是50,下一个字母X=10;X<L,所以50+10=60,再下一个字母X=10,X=X,所以加上X的值:60+10=70,至此该罗马字符解析完毕,结果为70.

其实可以看出重复不重复不要管,只要前面一个大于等于后面一个就加上相应的值。


那么有加肯定就会有减,和上面的刚好相反,如果说前一个小于后一个罗马字符表示的大小,那么就是把前一个的值减去,加上后一个的值。

例如XL=40;

首先看X=10;那么罗马数值为10,然后第二个字母L=50;明显X(10)<L(50),所以现在的值为10+50-10*2=40;

很多人会问为什么会减二倍欸?我们解析罗马字符串,在开始之前为它先把第一个的值加上了,而实际过程中我们的加减是要从第二位开始的,XL=50-10=40,CD=500-100=400,看得出就是后面一个的值减去前面的值。

下面来一个复杂一点的罗马数字--------》  CMXCIX

1.C=100,值为100

2。M=1000,C<M,值为1000-100=900;

3.X=10,X<M,值为900+10=910;

4.C=100,X<C,值为910-20+100=990;

5.I=1,C>I,值为990+1=991;

6.X=10,I<X,值为1001-2+10=999;


希望大家能够看懂

下面贴下代码:

#include <stdio.h>
#include <string.h>

int map[100];



int solve(char roma[]){
    int temp=0;
    int sum=0;
    for(int i=0;roma[i];i++){
        if(i==0){
            sum+=map[roma[i]];
            temp=map[roma[i]];
            continue;
        }
        if(map[roma[i]]>temp){
            sum+=map[roma[i]]-temp*2;
        }
        else{
            sum+=map[roma[i]];
            temp=map[roma[i]];
        }
    }
    return sum;
}

int main(){
    int n;
    map['I']=1;map['V']=5;map['X']=10;map['L']=50;map['C']=100;map['D']=500;map['M']=1000;
    while(scanf("%d",&n)!=EOF){
        char roma[20];
        for(int i=0;i<n;i++){
           scanf("%s",roma);
           printf("%d\n",solve(roma));
        }
    }


return 0;
}


你可能感兴趣的:(关于100以内的罗马数解析成阿拉伯数)