題目連結:a013: 羅馬數字

JAVA 程式碼

//作者:骷骷
//網誌:http://bekachu.pixnet.net/blog

import java.util.Scanner;

public class JAVA {
	
	private static String setR[]={"M", "CM", "D", "CD", "C", "XC", "L", "XL", "X", "IX", "V", "IV", "I"};
	private static int setI[]={1000, 900, 500, 400, 100, 90, 50, 40, 10, 9, 5, 4, 1};
	//將所有的減法結果也納入陣列中( CM、CD、XC、XL、IX、IV ),之後只要全部當作基本元素來做就好

	public static void main(String[] args) {
		
		Scanner sc = new Scanner(System.in);
		String s1,s2;
		
		while(!(s1=sc.next()).equals("#")){
			
			s2=sc.next();
			
			
			System.out.println( iToR( Math.abs( rToI(s2)-rToI(s1) ) ) );
		}
		
		sc.close();
	}
	
	private static int setRTosetI(String s){
		
		for(int i=0;i<setR.length;i++){
			
			if(s.equals(setR[i])){
				
				return setI[i];
			}
		}
		return 0;
	}
	
	private static int rToI(String s){
		
		int i=0;
		for(int j=0;j<s.length();j++){
			
			int a=0,b=0; //a 為某一個羅馬數字的阿拉伯數字值, b 是下一個
			boolean t=false; //t 代表 b 是否可以給 a 用
			
			if (t) {
				a=b;
				t=false;
			} else {
				a=setRTosetI(String.valueOf(s.charAt(j)));
			}
			
			if(j<s.length()-1){
				
				b=setRTosetI( String.valueOf( s.charAt(j+1) ) );
				
				if(a<b){
					i+=b-a;
					j++; //一次讀取 a、b, j 要多+1
				}else{
					i+=a;
					t=true;
				}
			}else{
				i+=a;
			}
		}
		
		return i;
	}
	
	private static String iToR(int i){
		
		if(i==0) return "ZERO";
		
		String s="";
		while(i>0){
			
			for(int j=0;j<setI.length;j++){
				
				if(setI[j]<=i){
					
					s+=setR[j];
					i-=setI[j];
					j--;
					continue;
				}
			}
		}
		
		return s;
	}
}
/*測試資料:
I I
ZERO
MM II
MCMXCVIII
#

備註:
I	1
IV  4
V	5
IX  9
X	10
XL  40
L	50
XC  90
C	100
CD  400
D	500
CM  900
M	1000
*/

 ==========

骷骷覺得這題難是難在對羅馬數字的規則不熟,

所以必須要 GOOGLE 一下羅馬數字的資料,

值得注意的是第 87、88 行,不會一直從頭開始做。

arrow
arrow
    文章標籤
    a013 羅馬數字 JAVA
    全站熱搜

    骷骷 發表在 痞客邦 留言(0) 人氣()