罗马数的解释在这儿。。飞机直达
关于罗马数字的知识
我们知道罗马数由这几个基本的符号表示
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; }