Given an integer, convert it to a roman numeral.
Input is guaranteed to be within the range from 1 to 3999.
class Solution {
public:
string intToRoman(int num) {
string result;
result += buildRoman('M', '\0', '\0', num/1000);
num = num % 1000;
result += buildRoman('C', 'D', 'M', num/100);
num = num % 100;
result += buildRoman('X', 'L', 'C', num/10);
num = num % 10;
result += buildRoman('I', 'V', 'X', num);
return result;
}
string buildRoman(char one, char five, char ten, int value)
{
string result = "";
switch(value)
{
case 1:
result += one;
break;
case 2:
result += one;
result += one;
break;
case 3:
result += one;
result += one;
result += one;
break;
case 4:
result += one;
result += five;
break;
case 5:
result += five;
break;
case 6:
result += five;
result += one;
break;
case 7:
result += five;
result += one;
result += one;
break;
case 8:
result += five;
result += one;
result += one;
result += one;
break;
case 9:
result += one;
result += ten;
break;
}
return result;
}
};
Round 2:
class Solution {
public:
string intToRoman(int num) {
string result = "";
int divide = 1000;
int index = 0;
while(num > 0)
{
helper(num/divide, index, result);
num = num % divide;
index += 2;
divide /= 10;
}
return result;
}
private:
void helper(int num, int index, string &result)
{
if(num == 0)
return;
string symbol[] = {"M", "D", "C", "L", "X", "V", "I"};
if(index == 0)
{
while(num > 0)
{
result += symbol[index];
num--;
}
}
else
{
switch(num)
{
case 1:
result += symbol[index];
break;
case 2:
result += symbol[index] + symbol[index];
break;
case 3:
result += symbol[index] + symbol[index] + symbol[index];
break;
case 4:
result += symbol[index] + symbol[index-1];
break;
case 5:
result += symbol[index-1];
break;
case 6:
result += symbol[index-1] + symbol[index];
break;
case 7:
result += symbol[index-1] + symbol[index] + symbol[index];
break;
case 8:
result += symbol[index-1] + symbol[index] + symbol[index] + symbol[index];
break;
case 9:
result += symbol[index] + symbol[index-2];
break;
}
}
}
};