请将给出的整数转化为罗马数字
保证输入数字的范围在1 到 3999之间。
//感觉这道题没什么意义 public String intToRoman(int num) { int[] values = { 1000, 900, 500, 400, 100, 90, 50, 40, 10, 9, 5, 4, 1 }; String[] strs = { "M", "CM", "D", "CD", "C", "XC", "L", "XL", "X", "IX", "V", "IV", "I" }; StringBuilder sb = new StringBuilder(); for (int i = 0; i < values.length; i++) { while (num >= values[i]) { num -= values[i]; sb.append(strs[i]); } } return sb.toString(); }
public static String intToRoman(int num) { String M[] = {"", "M", "MM", "MMM"}; String C[] = {"", "C", "CC", "CCC", "CD", "D", "DC", "DCC", "DCCC", "CM"}; String X[] = {"", "X", "XX", "XXX", "XL", "L", "LX", "LXX", "LXXX", "XC"}; String I[] = {"", "I", "II", "III", "IV", "V", "VI", "VII", "VIII", "IX"}; return M[num/1000] + C[(num%1000)/100] + X[(num%100)/10] + I[num%10]; } }
public class Solution {
public String intToRoman(int num) {
StringBuilder sb = new StringBuilder();
String[] signs = {"M","CM","D","CD","C","XC","L","XL","X","IX","V","IV","I"};
int[] values = {1000,900,500, 400,100, 90, 50, 40, 10, 9, 5, 4, 1};
for (int i = 0; num!=0; i++) {
while (num>=values[i]){
num -= values[i];
sb.append(signs[i]);
}
}
return sb.toString();
}
}
class Solution { public: string intToRoman(int num) { string one[]={"I","II","III","IV","V","VI","VII","VIII","IX"}; string ten[]={"X","XX","XXX","XL","L","LX","LXX","LXXX","XC"}; string hundred[]={"C","CC","CCC","CD","D","DC","DCC","DCCC","CM"}; string thou[]={"M","MM","MMM"}; string roman=""; if(num>=1000){roman += thou[num/1000-1]; num = num%1000;} if(num>=100){roman += hundred[num/100 -1]; num = num %100;} if(num>=10){roman += ten[num/10 - 1];num = num%10;} if(num>=1) roman += one[num%10 - 1]; return roman; } };
string intToRoman(int num) { string res=""; vector<int> key={1000,900,500,400,100,90,50,40,10,9,5,4,1}; vector<string> value={"M","CM","D","CD","C","XC","L","XL","X","IX","V","IV","I"}; for(int i=0;i<key.size();++i){ int count=num/key[i]; for(int j=0;j<count;++j) res+=value[i]; num=num%key[i]; } return res; }
class Solution { public: vector> dict={ {1,'I'}, {10,'X'}, {100,'C'}, {1000,'M'}, }; vector> dict2={ {5,'V'}, {50,'L'}, {500,'D'}, }; string intToRoman(int num) { int tmp; int n; string ret=""; for(int i=3;i>=0;i--){ n=num/dict[i].first; if(n>0){ if(1<=n&&n<=3) ret=ret+string(n,dict[i].second); if(n==4) ret=ret+dict[i].second+dict2[i].second; if(n==5) ret=ret+dict2[i].second; if(6<=n&&n<=8) ret=ret+dict2[i].second+string(n-5,dict[i].second); if(n==9) ret=ret+dict[i].second+dict[i+1].second; num=num%dict[i].first; } } return ret; } };
I 1
V 5
X 10
L 50
C 100
D 500
M 1000
再加上特殊的:900,400,90,40,9,4import java.util.*; public class Solution { /** * * @param num int整型 * @return string字符串 */ public String intToRoman (int num) { // write code here int[] numbers={1000,900,500,400,100,90,50,40,10,9,5,4,1}; String[] str={"M","CM","D","CD","C","XC","L","XL","X","IX","V","IV","I"}; String out=""; for(int i=0 ; i<numbers.length;i++) { while(true) { if(num/numbers[i]>0) { out=out+str[i]; num=num-numbers[i]; } else break; } } return out; } }
预先保存个、十、百、千位的各数值和对应的罗马表示符;
分离给定数字里的个位、十位、百位、千位;
然后将分离出的数字位与对应的罗马表示符进行匹配;
拼接个、十、百、千位的匹配字符串,形成最终的结果;
public class Solution { public String intToRoman(int num) { Map<Integer, String> onesMap = new HashMap<>(10); Map<Integer, String> tensMap = new HashMap<>(10); Map<Integer, String> hundredsMap = new HashMap<>(10); Map<Integer, String> thousandsMap = new HashMap<>(3); // 准备数据 // 个位 onesMap.put(0, ""); onesMap.put(1, "I"); onesMap.put(2, "II"); onesMap.put(3, "III"); onesMap.put(4, "IV"); onesMap.put(5, "V"); onesMap.put(6, "VI"); onesMap.put(7, "VII"); onesMap.put(8, "VIII"); onesMap.put(9, "IX"); // 十位 tensMap.put(0, ""); tensMap.put(1, "X"); tensMap.put(2, "XX"); tensMap.put(3, "XXX"); tensMap.put(4, "XL"); tensMap.put(5, "L"); tensMap.put(6, "LX"); tensMap.put(7, "LXX"); tensMap.put(8, "LXXX"); tensMap.put(9, "XC"); // 百位 hundredsMap.put(0, ""); hundredsMap.put(1, "C"); hundredsMap.put(2, "CC"); hundredsMap.put(3, "CCC"); hundredsMap.put(4, "CD"); hundredsMap.put(5, "D"); hundredsMap.put(6, "DC"); hundredsMap.put(7, "DCC"); hundredsMap.put(8, "DCCC"); hundredsMap.put(9, "CM"); // 千位 thousandsMap.put(0, ""); thousandsMap.put(1, "M"); thousandsMap.put(2, "MM"); thousandsMap.put(3, "MMM"); if (num < 10) { String result = onesMap.get(num); return result; } if (num < 100) { // 获取十位 int tensPlace = num / 10; String tensStr = tensMap.get(tensPlace); // 获取个位 int onesPlace = num - (tensPlace * 10); String onesStr = onesMap.get(onesPlace); // 拼接 return tensStr + onesStr; } if (num < 1000) { // 获取百位 int hundredsPlace = num / 100; String hundredsStr = hundredsMap.get(hundredsPlace); // 获取十位 int tensPlace = (num - (hundredsPlace * 100)) / 10; String tensStr = tensMap.get(tensPlace); // 获取个位 int onesPlace = num - (hundredsPlace * 100) - (tensPlace * 10); String onesStr = onesMap.get(onesPlace); return hundredsStr + tensStr + onesStr; } if (num < 4000) { // 获取千位 int thousandsPlace = num / 1000; String thousandsStr = thousandsMap.get(thousandsPlace); // 获取百位 int hundredsPlace = (num - (thousandsPlace * 1000)) / 100; String hundredsStr = hundredsMap.get(hundredsPlace); // 获取十位 int tensPlace = (num - (thousandsPlace * 1000) - (hundredsPlace * 100)) / 10; String tensStr = tensMap.get(tensPlace); // 获取个位 int onesPlace = num - (thousandsPlace * 1000) - (hundredsPlace * 100) - (tensPlace * 10); String onesStr = onesMap.get(onesPlace); return thousandsStr + hundredsStr + tensStr + onesStr; } else { return "not supported num!"; } } }
其实就是操作数组,然后拼接字符串的问题。
public class Solution { public String intToRoman(int num) { String ones[]={"I","II","III","IV","V","VI","VII","VIII","IX"}; String tens[]={"X","XX","XXX","XL","L","LX","LXX","LXXX","XC"}; String bais[]={"C","CC","CCC","CD","D","DC","DCC","DCCC","CM"}; String qians[]={"M","MM","MMM"}; String ge = num%10==0?"":ones[num%10 - 1]; String shi = num/10%10==0?"":tens[num/10%10 - 1]; String bai = num/100%10==0?"":bais[num/100%10 - 1]; String qian = num/1000==0?"":qians[num/1000 - 1]; return qian + bai + shi + ge; } }
class Solution { public: string intToRoman(int num) { string res = ""; vector<int> key = {1000, 900, 500, 400, 100, 90, 50, 40, 10, 9, 5, 4, 1}; vector<string> value={"M","CM","D","CD","C","XC","L","XL","X","IX","V","IV","I"}; for(int i = 0;i < key.size(); i++){ int count = num / key[i]; for(int j = 0;j < count; j++){ res += value[i]; } num %= key[i]; } return res; } };
class Solution {
public:
char dict[3][3]={{'I','V','X'},{'X','L','C'},{'C','D','M'}};
int nums[4]={1,10,100,1000};
string intToRoman(int num) {
string s="";
for(int i=3;i>0&&num>0;i--)
{
int tp=num/nums[i];
int tpp=num%nums[i];
for(int p=0;p<tp;p++)
s+=dict[i-1][2];
num-=tp*nums[i];
int k=tpp/nums[i-1];
if(k>8)
{
for(int p=0;p<10-k;p++)
s+=dict[i-1][0];
s+=dict[i-1][2];
}
else if(k>=5&&k<=8)
{
s+=dict[i-1][1];
for(int p=0;p<k-5;p++)
s+=dict[i-1][0];
}
else if(k>3)
{
for(int p=0;p<k-3;p++)
s+=dict[i-1][0];
s+=dict[i-1][1];
}
else
{
for(int p=0;p<k;p++)
s+=dict[i-1][0];
}
num-=nums[i-1]*k;
}
return s;
}
};
//6. integer-to-roman
string intToRoman(int num) {
//I(1), X(10), C(100), M(1000), V(5), L(50), D(500)
map<int, string> myMap{ {0, ""}, {1, "I"}, {2, "II"}, {3, "III"}, {4, "IV"}, {5, "V"}, {6, "VI"}, {7,"VII"}, {8, "VIII"}, {9, "IX"},
{10, "X"}, {20, "XX"}, {30, "XXX"}, {40, "XL"}, {50, "L"}, {60, "LX"}, {70,"LXX"}, {80, "LXXX"}, {90, "XC"},
{100, "C"}, {200, "CC"}, {300, "CCC"}, {400, "CD"}, {500, "D"}, {600, "DC"}, {700,"DCC"}, {800, "DCCC"}, {900, "CM"},
{1000, "M"}, {2000, "MM"}, {3000, "MMM"} };
string re = "";
int bit = 1000;
while(num) {
if(num / bit) {
int temp = num / bit * bit;
re += myMap[temp];
num -= temp;
}
else {
bit /= 10;
}
}
return re;
}
public class Solution { public String intToRoman(int num) { int[] values = { 1000, 900, 500, 400, 100, 90, 50, 40, 10, 9, 5, 4, 1 }; String[] strs = { "M", "CM", "D", "CD", "C", "XC", "L", "XL", "X", "IX", "V", "IV", "I" }; StringBuilder sb = new StringBuilder(); for (int i = 0; i < values.length; i++) { while (num >= values[i]) { num -= values[i]; sb.append(strs[i]); } } return sb.toString(); } }
class Solution { public: map<int, char> roman_digit_map = { { 1, 'I' },{ 5, 'V' },{ 10, 'X' }, { 50, 'L' },{ 100, 'C' },{ 500, 'D' }, { 1000, 'M' }, }; string intToRoman(int num) { string res; if (num == 0) return NULL; stack<int> s; int digit = 0; while (num != 0) { digit = num % 10; s.push(digit); num = num / 10; } int digit_num = s.size(); while (!s.empty()) { if (s.top() == 0) { s.pop(); digit_num--; continue; } else { res.append(numberToRoman(s.top(), pow(10, digit_num - 1))); s.pop(); digit_num--; } } return res; } private: string numberToRoman(int digit, int multiplier) { string res; switch (digit) { case 1: res.push_back(roman_digit_map.at(1 * multiplier)); break; case 2: res.push_back(roman_digit_map.at(1 * multiplier)); res.push_back(roman_digit_map.at(1 * multiplier)); break; case 3: res.push_back(roman_digit_map.at(1 * multiplier)); res.push_back(roman_digit_map.at(1 * multiplier)); res.push_back(roman_digit_map.at(1 * multiplier)); break; case 4: res.push_back(roman_digit_map.at(1 * multiplier)); res.push_back(roman_digit_map.at(5 * multiplier)); break; case 5: res.push_back(roman_digit_map.at(5 * multiplier)); break; case 6: res.push_back(roman_digit_map.at(5 * multiplier)); res.push_back(roman_digit_map.at(1 * multiplier)); break; case 7: res.push_back(roman_digit_map.at(5 * multiplier)); res.push_back(roman_digit_map.at(1 * multiplier)); res.push_back(roman_digit_map.at(1 * multiplier)); break; case 8: res.push_back(roman_digit_map.at(5 * multiplier)); res.push_back(roman_digit_map.at(1 * multiplier)); res.push_back(roman_digit_map.at(1 * multiplier)); res.push_back(roman_digit_map.at(1 * multiplier)); break; case 9: res.push_back(roman_digit_map.at(1 * multiplier)); res.push_back(roman_digit_map.at(10 * multiplier)); break; } return res; } };
public class Solution { public String intToRoman(int num) { int[] values = { 1000, 900, 500, 400, 100, 90, 50, 40, 10, 9, 5, 4, 1 }; String[] strs = { "M", "CM", "D", "CD", "C", "XC", "L", "XL", "X", "IX", "V", "IV", "I" }; StringBuilder sb = new StringBuilder(); for (int i = 0; i < values.length; i++) { while (num >= values[i]) { num -= values[i]; sb.append(strs[i]); } } return sb.toString(); } }
public String intToRoman(int num) { Map<Integer, String> map = new HashMap<>(); int[] keys = { 1000, 900, 500, 400, 100, 90, 50, 40, 10, 9, 5, 4, 1 }; String[] values = {"M","CM","D","CD","C","XC","L","XL","X","IX","V","IV","I"}; for (int i = 0; i < keys.length; i++) { map.put(keys[i], values[i]); } String res = ""; for (int i = 0; i < keys.length; i++) { int count = num/keys[i]; for(int j=0;j<count;j++){ res += map.get(keys[i]); } num %= keys[i]; } return res; }