力扣 12. 整数转罗马数字
解题思路
当某个位数的某个数不为4或9时,高位对应的字符总是在低位对应的字符前面。只有当该数为4或9时,低位对应的字符在高位前面。 根据这一特性,我们进行分类讨论。
1.当数为4时,则对应的罗马数为 10 ^ 幂次(对应该数位的次数)加上5 * 10 ^ 幂次。
如40,则对应的罗马数为 X(10)L(50)。
2.当数为9时,则对应的罗马数为 10 ^ 幂次(对应该数位的次数)加上5 * 10 ^ 幂次。
如90,则对应的罗马数为 X(10)C(100)。
3.当数为其他时,如果大于5,则先加上 5 * 10 ^ 幂次对应的罗马数,再加上 除5余数个数的 10^幂次对应的罗马数。如8,对应的罗马数为 V(5对应的罗马数)III(3个1对应的罗马数)
实现代码
class Solution {
public:
string intToRoman(int num) {
int quotient = 1; //当前位数的幂次;
string resStr = "";
while(num != 0){
int mod = num % 10;
string str;
if(mod == 9){
str.append(1, GetRoman(quotient));
str.append(1, GetRoman(10 * quotient));
}else if(mod == 4){
str.append(1,GetRoman(quotient));
str.append(1, GetRoman(5 * quotient));
}else{
if(mod >= 5){
str.append(1, GetRoman(5 * quotient));
}
mod = num % 5;
char ch = GetRoman(quotient);
for(int i = 1; i <= mod; i++)
str.append(1, ch);
}
resStr = str + resStr;
quotient *= 10;
num /= 10;
}
return resStr;
}
char GetRoman(int value){
char res;
switch (value)
{
case 1:
res = 'I';
break;
case 5:
res = 'V';
break;
case 10:
res = 'X';
break;
case 50:
res = 'L';
break;
case 100:
res = 'C';
break;
case 500:
res = 'D';
break;
case 1000:
res = 'M';
break;
default:
break;
}
return res;
}
};