-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathRoman.java
More file actions
74 lines (63 loc) · 1.55 KB
/
Roman.java
File metadata and controls
74 lines (63 loc) · 1.55 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
package laserfiche;
import java.util.LinkedHashMap;
import java.util.Map;
public class Roman {
public static LinkedHashMap<String, Integer> roman = new LinkedHashMap<String, Integer>();
public Roman(){
initRomanHash();
}
public static void initRomanHash(){
if(roman.size() > 0) return;
roman.put("M", 1000);
roman.put("CM", 900);
roman.put("D", 500);
roman.put("CD", 400);
roman.put("C", 100);
roman.put("XC", 90);
roman.put("L", 50);
roman.put("XL", 40);
roman.put("X", 10);
roman.put("IX", 9);
roman.put("V", 5);
roman.put("IV", 4);
roman.put("I", 1);
}
private Integer getInt(String s, int start, int end){
Integer v = null;
if(start==end) v = roman.get(Character.toString(s.charAt(start)));
else if(start < end) v = roman.get(s.substring(start, end+1));
if(null == v) throw new IllegalArgumentException("Error: unknow vocabulary");
return v;
}
public int Roman2Int(String s){
int i=0;
int r = 0;
while(i<s.length()){
Integer v1 = getInt(s,i,i);
if((i+1) < s.length() && v1<getInt(s,i+1,i+1)){
r+=getInt(s,i,i+1); i+=2;
}else{
r+=v1; i++;
}
}
return r;
}
public String Int2Roman(int v){
StringBuilder r = new StringBuilder();
while(v != 0){
for(Map.Entry<String, Integer> k : roman.entrySet()){
if(k.getValue() <= v){
r.append(k.getKey());
v-=k.getValue();
break;
}
}
}
return r.toString();
}
public static void main(String[] args){
Roman r = new Roman();
System.out.println(r.Roman2Int("MDCCC"));
System.out.println(r.Int2Roman(78));
}
}