로마 숫자 와 아랍 디지털 의 상호 화 자바 실현
다음 과 같은 몇 가지 규칙 에 주의 하 세 요. 1. 기본 숫자 I, X, C 중의 어느 하나, 자신의 연결 구성 수량, 또는 큰 수의 오른쪽 에 놓 아 구성 수량 을 사용 하거나 세 개 를 초과 해 서 는 안 됩 니 다.큰 수의 왼쪽 에 놓 으 면 하나만 사용 할 수 있다.2. 기본 숫자 V, L, D 중 하 나 를 소수 로 큰 수의 왼쪽 에 놓 고 상쇄 하 는 방법 으로 수량 을 구성 할 수 없다.큰 수의 오른쪽 에 놓 고 더 한 방식 으로 수량 을 구성 하고 하나만 사용 할 수 있다.3. I 는 V 와 X 왼쪽 에 만 사용 할 수 있다.X 는 L 과 C 왼쪽 에 만 사용 할 수 있다.C 는 D 와 M 왼쪽 에 만 사용 할 수 있 습 니 다.
우선 우 리 는 이런 계수 체계의 특징 이 무엇 인지 생각해 볼 수 있다.출력 에 선 을 그 을 수 없 기 때문에 너무 큰 수 를 논의 하 는 것 은 의미 가 없다. 그렇다면 선 을 그 지 않 아 도 표시 할 수 있 는 가장 큰 수 는 얼마 일 까?그래, MMMCMXCIX - 3999 를 생각 했 을 거 야.이런 계수 체계의 배수 관 계 는 결코 뚜렷 하지 않 고, 덧셈 관 계 는 더욱 뚜렷 하 다.예 를 들 어 369 는 먼저 300 - CCC 를 표시 한 다음 에 60 - LX, 그리고 9 - IX 를 나타 낸다.연결 하면 CCCLXIX...
public static String ArabToRoman(int Arab){
String Roman = "";
String[][] list={
{"","I","II","III","IV","V","VI","VII","VIII","IX"},
{"","X","XX","XXX","XL","L","LX","LXX","LXXX","XC"},
{"","C","CC","CCC","CD","D","DC","DCC","DCCC","CM"},
{"","M","MM","MMM","","","","","",""}
};
Roman += list[3][Arab/1000%10];
Roman += list[2][Arab/100%10];
Roman += list[1][Arab/10%10];
Roman += list[0][Arab%10];
return Roman;
}
아라비아 숫자 로 로마 숫자 를 돌 리 는 것 은 주로 10 진수 에 따라 모든 문 자 를 결정 하면 된다.로마 숫자 에서 아라비아 숫자 로 바 꾸 는 것 은 조금 번거롭다. 10 진수 마다 대응 하 는 문자열 의 길이 가 정 해 지지 않 기 때문이다.내 가 먼저 생각 한 것 은 위치 에 따라 판단 하고 매번 에 문 자 를 판단 한 다음 에 해당 하 는 값 을 더 해서 거 칠 지만 일 을 할 수 있다 는 것 이다.
public static int RomanToInt(String roman)
int res=0;
try {
while(roman.charAt(0)=='M'){res+=1000;roman = roman.substring(1);}
if(roman.charAt(0)=='D'){res+=500;roman = roman.substring(1);}
while(roman.charAt(0)=='C'){res+=100;roman = roman.substring(1);}
if(roman.charAt(0)=='D') {res+=300;roman = roman.substring(1);}
else if(roman.charAt(0)=='M'){res+=800; roman = roman.substring(1);}
if(roman.charAt(0)=='L'){res+=50;roman = roman.substring(1);}
while(roman.charAt(0)=='X'){res+=10;roman=roman.substring(1);}
if(roman.charAt(0)=='L'){res+=30;roman=roman.substring(1);}
else if(roman.charAt(0)=='C'){res+=80;roman=roman.substring(1);}
if(roman.charAt(0)=='V'){res+=5;roman=roman.substring(1);}
while(roman.charAt(0)=='I'){res+=1;roman=roman.substring(1);}
if(roman.charAt(0)=='V'){res+=3;roman=roman.substring(1);}
else if(roman.charAt(0)=='X'){res+=8;roman= roman.substring(1);}
} catch (StringIndexOutOfBoundsException e) {
return res;
}
return res;
}
문자열 이 빈 문자열 로 캡 처 된 후에 charAt (0) 을 호출 하면 오류 가 발생 합 니 다. 이 때 우 리 는 그것 을 캡 처 하여 얻 은 정 수 를 적시에 되 돌려 줍 니 다.키 쌍 과 정규 표현 식 을 사용 하 는 또 다른 방법 이 있 습 니 다.
-- -- -- -- -- -- -- -- --
public static int RomanToInt3(String Roman){
int res = 0;
String regex=null;
String s = "'',0,I,1,II,2,III,3,IV,4,V,5,VI,6,VII,7,VIII,8,IX,9,X,10,XX,20,XXX,30,XL,40,L,50,LX,60,LXX,70,LXXX,80,XC,90,C,100,CC,200,CCC,300,CD,400,D,500,DC,600,DCC,700,DCCC,800,CM,900,M,1000,MM,2000,MMM,3000";
String c[]=s.split(",");// , s
Pattern p;//
// ,
for(int t=c.length-2;t>0;t-=2){
String roma = c[t];
int value = Integer.parseInt(c[t+1]);
regex="^("+roma+")"; p=Pattern.compile(regex,Pattern.CASE_INSENSITIVE);
Matcher matcher=p.matcher(Roman);
if(matcher.find()){
res += value;
Roman=Roman.substring(((String)roma).length());
// System.out.print(Roman + "\t\t");
// System.out.print(regex + "\t\t");
// System.out.println(res);
}
}
return res;
}
맵 으로 키 를 저장 하려 고 했 으 나 맵 의 요 소 를 옮 겨 다 니 는 Iterator 는 넣 은 키 에 따라 선착순 으로 옮 겨 다 니 는 것 이 아니 라 알파벳 순 으로 옮 겨 다 니 는 것 입 니 다.즉, 옮 겨 다 닐 때마다 C 를 찾 고 CC 를 찾 는 것..............................................................................그래서 저 는 문자열 배열 을 직접 사 용 했 습 니 다. 큰 것 부터 작은 것 까지 옮 겨 다 녔 습 니 다. 그러면 높 은 위치 에서 지위 까지 로마 숫자 에 대한 잘못된 뜻 이 생기 지 않 을 것 입 니 다.정규 표현 식 은 문자열 처리 의 이기 입 니 다.