1. 程式人生 > >Java經典題:羅馬數字和阿拉伯數字的相互轉換

Java經典題:羅馬數字和阿拉伯數字的相互轉換

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

import java.util.Scanner;

/**
 * 請編寫程式,由使用者輸入若干個羅馬數字串,程式輸出對應的十進位制表示。
 * 
 * 輸入格式是:第一行是整數n,表示接下來有n個羅馬數字(n<100)。以後每行一個羅馬數字。羅馬數字大小不超過999。
 * 
 * 要求程式輸出n行,就是羅馬數字對應的十進位制資料。
 * 
 * 例如,使用者輸入: 3 LXXX XCIII DCCII
 * 
 * 則程式應該輸出: 80 93 702
 * 
 * @author Administrator
 * 
 *         {@link http://www.devba.com/index.php/archives/3179.html} 羅馬數字
 */
public class RomeToArabic {

	public static void main(String[] args) {
		// TODO Auto-generated method stub
		Scanner mScanner = new Scanner(System.in);
		System.out.println(r2a(mScanner.nextLine()));
		System.out.println(a2r(mScanner.nextInt()));
	}

	/**
	 * 把羅馬數字轉換為阿拉伯數字
	 * 
	 * @param m
	 * @return
	 */
	public static int r2a(String m) {
		int graph[] = new int[400];
		graph['I'] = 1;
		graph['V'] = 5;
		graph['X'] = 10;
		graph['L'] = 50;
		graph['C'] = 100;
		graph['D'] = 500;
		graph['M'] = 1000;
		char[] num = m.toCharArray();
		int sum = graph[num[0]];
		for (int i = 0; i < num.length - 1; i++) {
			if (graph[num[i]] >= graph[num[i + 1]]) {
				sum += graph[num[i + 1]];
			} else {
				sum = sum + graph[num[i + 1]] - 2 * graph[num[i]];
			}
		}
		return sum;
	}

	/**
	 * 把阿拉伯數字轉換為羅馬數字
	 * 
	 * @param number
	 * @return
	 */
	public static String a2r(int number) {
		String rNumber = "";
		int[] aArray = { 1000, 900, 500, 400, 100, 90, 50, 40, 10, 9, 5, 4, 1 };
		String[] rArray = { "M", "CM", "D", "CD", "C", "XC", "L", "XL", "X",
				"IX", "V", "IV", "I" };
		if (number < 1 || number > 3999) {
			rNumber = "-1";
		} else {
			for (int i = 0; i < aArray.length; i++) {
				while (number >= aArray[i]) {
					rNumber += rArray[i];
					number -= aArray[i];
				}
			}
		}
		return rNumber;
	}
}