罗马数字的表示主要依赖以下几个基本符号:
I 1 V 5 X 10 L 50 C 100 D 500 M 1000
这里,我们只介绍一下1000以内的数字的表示法。
单个符号重复多少次,就表示多少倍。最多重复3次。比如:CCC表示300 XX表示20,但150并不用LLL表示,这个规则仅适用于I X C M。
如果相邻级别的大单位在右,小单位在左,表示大单位中扣除小单位。比如:IX表示9 IV表示4 XL表示40 更多的示例参见下表,你找到规律了吗
本题目的要求是:请编写程序,由用户输入若干个罗马数字串,程序输出对应的十进制表示。
输入格式是:第一行是整数n,表示接下来有n个罗马数字(n<100)。以后每行一个罗马数字。罗马数字大小不超过999。
要求程序输出n行,就是罗马数字对应的十进制数据。 例如,用户输入: 3 LXXX XCIII DCCII
则程序应该输出: 80 93 702
#include<stdio.h>
#include<string.h>
int LuoMa(char *s){
int num = 0;
int i=0;
int sum = strlen(s);
for(i=0;i<sum;i++){
if(s[i]=='I')
num+=1;
else if(s[i]=='V'){
if(i>0&&s[i-1]=='I')
num+=5-1-1;
else
num+=5;
}
else if(s[i]=='X'){
if(i>0&&s[i-1]=='I')
num+=10-1-1;
else if(i>0&&s[i-1]=='V')
num+=10-5-5;
else
num+=10;
}
else if(s[i]=='L'){
if(i>0&&s[i-1]=='I')
num+=50-1-1;
else if(i>0&&s[i-1]=='V')
num+=50-5-5;
else if(i>0&&s[i-1]=='X')
num+=50-10-10;
else
num+=50;
}
else if(s[i]=='C'){
if(i>0&&s[i-1]=='I')
num+=100-1-1;
else if(i>0&&s[i-1]=='V')
num+=100-5-5;
else if(i>0&&s[i-1]=='X')
num+=100-10-10;
else if(i>0&&s[i-1]=='L')
num+=100-50-50;
else
num+=100;
}
else if(s[i]=='D'){
if(i>0&&s[i-1]=='I')
num+=500-1-1;
else if(i>0&&s[i-1]=='V')
num+=500-5-5;
else if(i>0&&s[i-1]=='X')
num+=500-10-10;
else if(i>0&&s[i-1]=='L')
num+=500-50-50;
else if(i>0&&s[i-1]=='C')
num+=500-100-100;
else
num+=500;
}
else if(s[i]=='M'){
if(i>0&&s[i-1]=='I')
num+=1000-1-1;
else if(i>0&&s[i-1]=='V')
num+=1000-5-5;
else if(i>0&&s[i-1]=='X')
num+=1000-10-10;
else if(i>0&&s[i-1]=='L')
num+=1000-50-50;
else if(i>0&&s[i-1]=='C')
num+=1000-100-100;
else if(i>0&&s[i-1]=='C')
num+=1000-100-100;
else if(i>0&&s[i-1]=='D')
num+=1000-500-500;
else
num+=500;
}
}
return num;
}
int main(){
int n;
char s[100];
int sum;
int i;
int length;
int j=0;
scanf("%d",&n);
for(i=0;i<n;i++){
scanf("%s",s);
sum = LuoMa(s);
printf("罗马数字为:%d\n",sum);
}
return 0;
}
另一种解法,利用数组
#include<stdio.h>
#include<string.h>
int main(){
int i,j;
int n;
char s[100];
int num[7]={1,5,10,50,100,500,1000};
int line[7];
char LuoMa[7]={'I','V','X','L','C','D','M'};
int LuoMaNum=0;
int k=0,sum,g;
scanf("%d",&n);
for(i=0;i<n;i++){
scanf("%s",&s);
int jea=strlen(s);
for( sum=0;sum < jea;sum++){
for(j=0;j<7;j++)
if(s[sum]==LuoMa[j]){
line[k++]=j;
break;
}
}
for(g=0;g<k-1;){
if(line[g]>line[g+1]){
LuoMaNum+=num[line[g]];
g++;
}
else if(line[g]<line[g+1]){
LuoMaNum+=num[line[g+1]]-num[line[g]];
g+=2;
}
else if(line[g]==line[g+1]){
LuoMaNum+=num[line[g]];
g++;
}
}
if(g<k)
LuoMaNum+=num[line[g]];
k=0;
printf("%d\n",LuoMaNum);
LuoMaNum=0;
}
return 0;
}
|