题意:Given an integer, convert it to a roman numeral.
Input is guaranteed to be within the range from 1 to 3999.
分析:
数字对应罗马字符:
- I placed before V or X indicates one less, so four is IV (one less than five) and nine is IX (one less than ten)
- X placed before L or C indicates ten less, so forty is XL (ten less than fifty) and ninety is XC (ten less than a hundred)
- C placed before D or M indicates a hundred less, so four hundred is CD (a hundred less than five hundred) and nine hundred is CM (a hundred less than a thousand)
AC代码:
string intToRoman(int num){
int base = 1;
string ret_str;
while(num / base){
int digit = ( num / base ) % 10 * base;
if(digit != 0){
ret_str = num2Roman(digit, base) + ret_str;
}
base *= 10;
}
return ret_str;
}
string base2Roman(int n){
string ret_str;
switch(n){
case 1:
ret_str = 'I';
break;
case 5:
ret_str = 'V';
break;
case 10:
ret_str = 'X';
break;
case 50:
ret_str = 'L';
break;
case 100:
ret_str = 'C';
break;
case 500:
ret_str = 'D';
break;
case 1000:
ret_str = 'M';
break;
}
return ret_str;
}
string num2Roman(int n, int base){ //base = 1, 10, 100
int i = n / base;
string ret_str;
while(i > 0){
if(i == 9){
ret_str = base2Roman(base) + base2Roman(base * 10);
i -= 9;
}else if(i > 4){
ret_str = base2Roman(base * 5);
i -= 5;
}else if(i == 4){
ret_str = base2Roman(base) + base2Roman(base * 5);
i -= 4;
}else{
ret_str += base2Roman(base);
i --;
}
}
return ret_str;
}