题目:
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) {
int digit_a=0;//个
int digit_b=0;//十
int digit_c=0;//百
int digit_d=0;//千
string result="";
digit_d=num/1000;
digit_c=(num-digit_d*1000)/100;
digit_b=(num-digit_d*1000-digit_c*100)/10;
digit_a=num-digit_d*1000-digit_c*100-digit_b*10;
//千
switch(digit_d){
case 0:
result=result+"";
break;
case 1:
result="M"+result;
break;
case 2:
result="MM"+result;
break;
case 3:
result="MMM"+result;
break;
default:
break;
}
//百
switch(digit_c){
case 0:
result=result+"";
break;
case 1:
result=result+"C";
break;
case 2:
result=result+"CC";
break;
case 3:
result=result+"CCC";
break;
case 4:
result=result+"CD";
break;
case 5:
result=result+"D";
break;
case 6:
result=result+"DC";
break;
case 7:
result=result+"DCC";
break;
case 8:
result=result+"DCCC";
break;
case 9:
result=result+"CM";
break;
default:
break;
}
//十
switch(digit_b){
case 0:
result=result+"";
break;
case 1:
result=result+"X";
break;
case 2:
result=result+"XX";
break;
case 3:
result=result+"XXX";
break;
case 4:
result=result+"XL";
break;
case 5:
result=result+"L";
break;
case 6:
result=result+"LX";
break;
case 7:
result=result+"LXX";
break;
case 8:
result=result+"LXXX";
break;
case 9:
result=result+"XC";
break;
default:
break;
}
//个
switch(digit_a){
case 0:
result=result+"";
break;
case 1:
result=result+"I";
break;
case 2:
result=result+"II";
break;
case 3:
result=result+"III";
break;
case 4:
result=result+"IV";
break;
case 5:
result=result+"V";
break;
case 6:
result=result+"VI";
break;
case 7:
result=result+"VII";
break;
case 8:
result=result+"VIII";
break;
case 9:
result=result+"IX";
break;
default:
break;
}
return result;
}
};
//简洁版
class Solution {
public:
string intToRoman(int num) {
string result="";
int count=0;
while (num) {
count++;
string BeyondDig="";
string LargerDig="";
string SmallerDig="";
int digit =num-num/10*10;
num=num/10;
switch(count){
case 1:
BeyondDig="X";
LargerDig="V";
SmallerDig="I";
break;
case 2:
BeyondDig="C";
LargerDig="L";
SmallerDig="X";
break;
case 3:
BeyondDig="M";
LargerDig="D";
SmallerDig="C";
break;
case 4:
BeyondDig="";
LargerDig="";
SmallerDig="M";
break;
}
//个十百千
switch(digit){
case 0:
result=""+result;
break;
case 1:
result=SmallerDig+result;
break;
case 2:
result=SmallerDig+SmallerDig+result;
break;
case 3:
result=SmallerDig+SmallerDig+SmallerDig+result;
break;
case 4:
result=SmallerDig+LargerDig+result;
break;
case 5:
result=LargerDig+result;
break;
case 6:
result=LargerDig+SmallerDig+result;
break;
case 7:
result=LargerDig+SmallerDig+SmallerDig+result;
break;
case 8:
result=LargerDig+SmallerDig+SmallerDig+SmallerDig+result;
break;
case 9:
result=SmallerDig+BeyondDig+result;
break;
default:
break;
}
}
return result;
}
};
update: 2014-10-09
class Solution {
public:
string intToRoman(int num) {
string thousand[4] = {"", "M", "MM","MMM"};
string hundred[11] = {"", "C","CC","CCC","CD","D","DC","DCC","DCCC","CM"};
string ten[11] = {"", "X", "XX","XXX","XL","L","LX","LXX","LXXX","XC"};
string one[11] = {"", "I","II","III","IV","V","VI","VII","VIII","IX"};
string result = "";
string* trans[4] = {one, ten, hundred, thousand};
int index = 0;
while (num > 0) {
result = trans[index][num % 10] + result;
num = num / 10;
index++;
}
return result;
}
};