2016年1月15日 星期五

a013: 羅馬數字

內容 :
如果生活在數世紀之前的古羅馬,你應該用過 V 來表示五。V 和 5 這兩個符號都可以用來表示數目五。用來表示數目的符號稱作數字。而羅馬人用來表示數目的符號就是羅馬數字。
以下是七個基本的羅馬數字︰

羅馬數字數目
I1
V5
X10
L50
C100
D500
M1,000
所有其他的數目都是由這些數字組合而成。數目都是由左寫到右,通常值是等於組成的羅馬數字加起來。
例如十七可以表示為

        X+V+I+I=XVII
        10+5+1+1=17
表示羅馬數字可以使用減法來取代加法的規則。例如四可以不用四個一相加來表示 IIII,而採用五減一來表示 IV。利用這類規則,羅馬人能夠減化許多數目的表示方式,例如 IX 取代 VIIII 表示 9,及 CD 取代 CCCC 表示 400。
今日我們並不確定羅馬符號的起源為何。例如符號 V 的起源主要有兩個理論。有些學者認為五最早是用握拳、拇指在外的手勢來表示。最後以象形文字書寫而簡化為 V。
另一個理論認為 X 源自在 10 條線加上交叉線。因此五可以表示為 X 的一半,或是 V。
羅馬數字可以很容易地用來相加或相減,但算起乘除法就相當不順手。這就是為什麼現在羅馬數字並不常用的原因了。

問題

然而,羅馬數字還是經常用於書本章節及頁碼的編號。在這一題工作是讀入兩個正整數,然後輸出兩個數字差的絕對值。所有的數字都必須以羅馬數字來表示。而連續四個相同符號出現時,必須用減法規則來化簡之。



輸入說明 : 
每個輸入檔中會有一個或以上的測試資料。每一行由兩個數字組成一筆測試資料,且所有數字將會小於4,000。檔案最後會以符號 # 表示結束。
輸出說明 : 
每筆測試資料的答案必須輸出到檔案中,並且換行。如果答案為零,則須輸出字串 ZERO。
範例輸入 : help
I I
MM II
#
範例輸出:
ZERO
MCMXCVIII
提示 : 
標籤:
出處: 


import java.util.Scanner;

public class a013 {
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};

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(changeString(Math.abs(changeNum(s2)-changeNum(s1))));
}

}
private static int changeNum(String s){
int i=0;
for(int j=0;j<s.length();j++){
int a=0,b=0;
boolean flag=false;
if(flag){
a=b;
flag=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++;
}
else{
i+=a;
flag=true;
}
}else{
i+=a;
}
}
return i;
}
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 String changeString(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;
}

}

沒有留言:

張貼留言