蓝桥杯-——罗马数字的暴力破解

蓝桥杯-——罗马数字的暴力破解,第1张

蓝桥杯-——罗马数字的暴力破解

罗马数字的表示主要依赖以下几个基本符号:

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
#include
int LuoMa(char *s){
	int num = 0;
	int i=0;
	int sum = strlen(s);
		for(i=0;i0&&s[i-1]=='I')
				num+=5-1-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 


另一种解法,利用数组

#include
#include
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[]="IVXLCDM";
	char LuoMa[7]={'I','V','X','L','C','D','M'};
	int LuoMaNum=0;
	int k=0,sum,g;
	scanf("%d",&n);
	for(i=0;iline[g+1]){
				LuoMaNum+=num[line[g]];
				g++;
			}
			else if(line[g] 

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/zaji/5703029.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-12-17
下一篇 2022-12-17

发表评论

登录后才能评论

评论列表(0条)

保存