首页 > 其他 > 详细

2012蓝桥杯【初赛试题】罗马数字

时间:2014-02-18 02:19:35      阅读:421      评论:0      收藏:0      [点我收藏+]

题目描述:

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

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

    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 更多的示例参见下表,你找到规律了吗?

I,1 
II,2
III,3
IV,4
V,5
VI,6
VII,7
VIII,8
IX,9 

X,10
XI,11
XII,12
XIII,13
XIV,14
XV,15
XVI,16
XVII,17
XVIII,18
XIX,19
XX,20
XXI,21
XXII,22
XXIX,29
XXX,30
XXXIV,34
XXXV,35
XXXIX,39
XL,40
L,50
LI,51
LV,55
LX,60
LXV,65
LXXX,80
XC,90
XCIII,93
XCV,95
XCVIII,98
XCIX,99


C,100
CC,200
CCC,300
CD,400
D,500
DC,600
DCC,700
DCCC,800
CM,900
CMXCIX,999
    本题目的要求是:请编写程序,由用户输入若干个罗马数字串,程序输出对应的十进制表示。

    输入格式是:第一行是整数n,表示接下来有n个罗马数字(n<100)。以后每行一个罗马数字。罗马数字大小不超过999。

    要求程序输出n行,就是罗马数字对应的十进制数据。

    例如,用户输入:
3
LXXX
XCIII
DCCII

    则程序应该输出:
80
93

702


程序分析:

这个题目的难点有两个:

1.需要将7个罗马字符与对应的10进制数字建立对应关系;

2.需要实现对罗马数字向10进制的转换。

解决方法分别是:

1.建立字符数组,然后按照顺序保存罗马数字,建立同样大小的int数组并按照顺序保存罗马数字对应的十进制;

则两个数组之间的关系是按照顺序一一对应,我们只需要对输入的每一个字符根据字符数组进行判断,然后保存它对应的序号,并根据序号调用罗马数字对应的十进制。

demo:

#include<iostream>
using namespace std;
void fun(int *a,int len)
{
	int b[7]={1,5,10,50,100,500,1000};
	for(int i=0;i<len;i++)
	{
		cout<<b[a[i]]<<" ";
	}
	cout<<endl;
}
int main()
{
	char str[10];
	char a[7]={‘I‘,‘V‘,‘X‘,‘L‘,‘C‘,‘D‘,‘M‘};
	int  b[7]={};
	int n;
	cin>>n;
	getchar();
	for(int k=0;k<n;k++)
	{
		int i=0;
		while((str[i]=getchar())!=‘\n‘)
		{
			for(int j=0;j<7;j++)
			{
				if(str[i]==a[j])//与罗马字符进行比对 
				{
					b[i] = j;	//将对应序号存放在b中 
					break;	
				}			
			}
			i++;
		}	
		 fun(b,i);	
	}
}
输出结果:

bubuko.com,布布扣

2.将每个罗马字符,从左向右进行判断,如果a[i]>=a[i+1]则表明相邻的数字,左边大于右边,所以a[i]可以加到总和里面,

如果a[i]<a[i+1]就说明相邻的数字,右边大于左边,所以将a[i+1]-a[i]加到总和里面。

程序代码:

#include<iostream>
using namespace std;
int fun(int *a,int len)
{
	int b[7]={1,5,10,50,100,500,1000};
	int sum = 0;
	int i;
	for(i=0;i<len-1;)
	{
		if(a[i]>=a[i+1])
		{
			sum += b[a[i]];
			i++;	
		}
		else
		{
			sum += b[a[i+1]]-b[a[i]];
			i += 2;	
		}
	}
	if(i<len)
	{
		sum += b[a[len-1]];
	}
	return sum;
}
int main()
{
	char str[10];
	char a[7]={‘I‘,‘V‘,‘X‘,‘L‘,‘C‘,‘D‘,‘M‘};
	int  b[7]={};
	int n;
	cin>>n;
	getchar();
	for(int k=0;k<n;k++)
	{
		int i=0;
		while((str[i]=getchar())!=‘\n‘)
		{
			for(int j=0;j<7;j++)
			{
				if(str[i]==a[j])
				{
					b[i] = j;
					break;	
				}			
			}
			i++;
		}	
		int num=0;
		num = fun(b,i);
		cout<<num<<endl;	
	}
}

题目中的所以示例代码均经过测试。

2012蓝桥杯【初赛试题】罗马数字

原文:http://blog.csdn.net/qsyzb/article/details/19336297

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!