1. 程式人生 > >羅馬數字轉換為十進位制數字

羅馬數字轉換為十進位制數字

<pre name="code" class="html">給定一個羅馬數字s,( I<=s<=MMMCMXCIX)(即1到3999),將羅馬數字轉換成整數。

如羅馬數字I,II,III,IV,V分別代表數字1, 2, 3, 4, 5。

格式:

   第一行輸入一個羅馬數字,接下來輸出對應的整數。

提示:

   首先要來了解一下羅馬數字表示法,基本字元有7個:I,V,X,L,C,D,M,分別表示1,5,10,50,100,500,1000。

在構成數字的時候,有下列規則:

1、相同的數字連寫,所表示的數等於這些數字相加得到的數,如:Ⅲ = 3;

2、小的數字在大的數字的右邊,所表示的數等於這些數字相加得到的數, 如:Ⅷ = 8;Ⅻ = 12;

3、小的數字,(限於Ⅰ、X 和C)在大的數字的左邊,所表示的數等於大數減小數得到的數,如:Ⅳ= 4;Ⅸ= 9;

4、正常使用時,連寫的數字重複不得超過三次。

樣例1

輸入:

CXXIII
輸出:

123
package rome_to_decimal_1;

import java.util.ArrayList;
import java.util.HashMap;
import java.util.Iterator;
import java.util.Scanner;

public class Main {

	public static int reap_main_right = 0;
	public static int reap_main_left = 0;

	public static void main(String[] args) {

		int sum = 0;
		int sum_right = 0;
		int sum_left = 0;
		String string_right = "";
		String string_left = "";
		ArrayList<String>  list = new ArrayList<String>();
        ArrayList<Integer> listNum = new ArrayList<Integer>();
		
		Scanner input = new Scanner(System.in);
	    String string = input.nextLine();
		///String string = "CXXIII";
		int len = string.length();
		while(len>=1){
			if(len==1){
				string_right=string.substring(0, 1);
				///System.out.println(string_right);
				list.add(String.valueOf(multi(string_right)));
				break; ////   while   for  裡面均可以有break語句;
			}else{
			String  subString=string.substring(0, len);
			reap_main_right = repeat(subString);
			len=len-reap_main_right;
			string_right = string.substring(subString.length() - reap_main_right,subString.length());
		///System.out.println(string_right);
			list.add(String.valueOf(multi(string_right)));
			}
		}///while
		///System.out.println("---------------");	
		for(int i=list.size()-1;i>=0;i--){
			listNum.add(Integer.valueOf(list.get(i)));
		}
//		Iterator it = listNum.iterator();
//		while(it.hasNext()){
//			System.out.println(it.next());
//		}
		for(int j=list.size()-1;j>=1;j--){
		    if(listNum.get(j)>listNum.get(j-1)){
		    	listNum.set(j-1, listNum.get(j)-listNum.get(j-1));
		    	listNum.remove(j);
		    }else{
		    	listNum.set(j-1, listNum.get(j-1)+listNum.get(j));
		    	listNum.remove(j);
		    }
		}
		
		System.out.println(listNum.get(0));
	}// /main
		// ///從後往前運算,統計出現的重複字母數
	public static int repeat(String str) {
		// int i = str.length() - 1;
		int reap_reap = 1;
		char endChar = str.charAt(str.length() - 1);
		for (int i = str.length() - 2; i >= 0; i--) {
			if (str.charAt(i) == endChar) {
				reap_reap++;
			} else {
				break;
			}
		}
		return reap_reap;
	}////repeat
	// ////連續位數的和是多少
	public static int multi(String str) {
		if (str.contains("I")) {

			return 1 * str.length();
		} else if (str.contains("X")) {

			return 10 * str.length();
		} else if (str.contains("L")) {

			return 50 * str.length();
		} else if (str.contains("C")) {

			return 100 * str.length();
		} else if (str.contains("D")) {

			return 500 * str.length();
		} else if (str.contains("M")) {

			return 1000 * str.length();
		}
		return 0;

	}////multi

}
MMMCMXCIX

3999

方法二:

public class Main {
    //羅馬數字表示法,基本字元有7個:I,V,X,L,C,D,M,分別表示1,5,10,50,100,500,1000。
    public int romanToInt(String s) {
        int sum = 0;
        //先減去2倍,後面再遇到時每一位都是再加一次,所以還是減去了一次
        if (s.indexOf("IV") != -1) sum -= 2;
        if (s.indexOf("IX") != -1) sum -= 2;
        if (s.indexOf("XL") != -1) sum -= 20;
        if (s.indexOf("XC") != -1) sum -= 20;
        if (s.indexOf("CD") != -1) sum -= 200;
        if (s.indexOf("CM") != -1) sum -= 200L;

        char[] c = s.toCharArray();
        for (int i = 0; i < s.length(); i++) {
            if (c[i] == 'I') sum += 1;
            if (c[i] == 'V') sum += 5;
            if (c[i] == 'X') sum += 10;
            if (c[i] == 'L') sum += 50;
            if (c[i] == 'C') sum += 100;
            if (c[i] == 'D') sum += 500;
            if (c[i] == 'M') sum += 1000;
        }
        return sum;
    }//romanToInt

    public static void main(String[] args) {
        System.out.println(new Main().romanToInt("XXX"));//30
        System.out.println(new Main().romanToInt("IVXX"));//24
        System.out.println(new Main().romanToInt("IXXX"));//29
        System.out.println(new Main().romanToInt("CDCXXI"));//521
    }
}