标题:罗马数字
/**
题目:
古罗马帝国开创了辉煌的人类文明,但他们的数字表示法的确有些繁琐,尤其在表示大数的时候,现在看起来简直不能忍受,
所以在现代很少使用了。之所以这样,不是因为发明表示法的人的智力的问题,而是因为一个宗教的原因,
当时的宗教禁止在数字中出现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
C,100
CC,200
CCC,300
CD,400
D,500
DC,600
DCC,700
DCCC,800
CM,900
CMXCIX,999
I 1
V 5
X 10
L 50
C 100
D 500
M 1000
本题目的要求是:请编写程序,由用户输入若干个罗马数字串,程序输出对应的十进制表示。
输入格式是:第一行是整数n,表示接下来有n个罗马数字(n<100)。以后每行一个罗马数字。罗马数字大小不超过999。
要求程序输出n行,就是罗马数字对应的十进制数据。
例如,用户输入:
3
LXXX
XCIII
DCCII
则程序应该输出:
80
93
702
思路:首先,大家先将罗马数字转化为数字,比如说LXXX就是50 10 10 10转化为阿拉伯是80,XCIII是10 100 1 1 1转化阿拉伯是93,大家可从中发现,这个是倒着运算的,也就是从后面往前算的,而且如果后面一位是小于前面一位数的话那么就做加法运算,如果是大于前面一位数的话那么就做减法运算。那么就好办了,此题在将每个罗马数字中的每个符号转换为数字的时候可以引用集合ArrayList<Integer>来转换就更加方便了(可变长度数组,储存方便,不用每次初始化都需要考虑到数组的大小问题,因为每个罗马数字的串长不同)
核心代码:
*/
public static void main(String[] args)
{
Scanner s=new Scanner(System.in);
int n=s.nextInt();
String str[]=new String[n];
int arr[]=new int[n];
for(int i=0;i<n;i++)
{
ArrayList<Integer> a=new ArrayList<Integer>(); //可变长度数字储存数据
str[i]=s.next();
function(str[i],a);
int sum=a.get(a.size()-1); //代表的是最后一个数
for(int j=a.size()-2;j>=0;j--)
{
if(a.get(j+1)<=a.get(j)) //罗马数字中找出的规律
{
sum=sum+a.get(j);
}
else
{
sum=Math.abs(sum-a.get(j));
}
}
arr[i]=sum;
}
for(int a1 : arr)
System.out.println(a1);
}
//功能:对罗马数字字符串进行转换并储存到集合中
private static void function(String s, ArrayList<Integer> a)
{
char c[]=s.toCharArray();
for(int i=0;i<c.length;i++)
{
if(c[i]=='I')
a.add(1);
if(c[i]=='V')
a.add(5);
if(c[i]=='X')
a.add(10);
if(c[i]=='L')
a.add(50);
if(c[i]=='C')
a.add(100);
if(c[i]=='D')
a.add(500);
if(c[i]=='M')
a.add(1000);
}
}
}
运行结果:
输入:
4
LIIIIIX
VXXC
MD
CDL
输出:
63
95
1500
450