標題:羅馬數字
/**
題目:
古羅馬帝國開創了輝煌的人類文明,但他們的數字表示法的確有些繁瑣,尤其在表示大數的時候,現在看起來簡直不能忍受,
所以在現代很少使用了。之所以這樣,不是因爲發明表示法的人的智力的問題,而是因爲一個宗教的原因,
當時的宗教禁止在數字中出現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