Given an integer, convert it to a roman numeral.
Input is guaranteed to be within the range from 1 to 3999.
public String intToRoman(int num) { StringBuilder sb = new StringBuilder(); Map<Integer, String> map = new HashMap<Integer, String>(); map.put(1, "I"); map.put(5, "V"); map.put(10, "X"); map.put(50, "L"); map.put(100, "C"); map.put(500, "D"); map.put(1000, "M"); int base = 1000; while(base >= 1) { int n = num/base; if(n==4) { sb.append(map.get(base)).append(map.get(base*5)); } else if(n==9) { sb.append(map.get(base)).append(map.get(base*10)); } else { if(n>=5) { sb.append(map.get(base*5)); n -= 5; } for(int i=0; i<n; i++) { sb.append(map.get(base)); } } num %= base; base /= 10; } return sb.toString(); }
C++代码更简洁一些:
string intToRoman(int num) { unordered_map<int, char> map = {{1,'I'},{5,'V'},{10,'X'},{50,'L'},{100,'C'},{500,'D'},{1000, 'M'}}; string res; vector<int> list = {1000, 100, 10, 1}; for(auto n:list) { int d = num/n; num %= n; if(d == 0) continue; if(d < 4) { res.append(d, map[n]); } else if(d == 4) { res += map[n]; res += map[n*5]; } else if(d < 9) { res += map[n*5]; if(d > 5) res.append(d-5, map[n]); } else if(d == 9) { res += map[n]; res += map[n*10]; } } return res; }