題目連結: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 行,不會一直從頭開始做。
文章標籤
全站熱搜
留言列表