问题描述
简要思路
通过取余和取模,从高位到低位,一位位地进行判断,并输出相应的罗马字母。
题目不难但是写起来较麻烦,在评论看到了更简洁的解法,贴在了解法2,不过没有解法1速度快。
代码
解法1:
class Solution {
public:
string intToRoman(int num) {
string output_str;
int p;
p = num / 1000;
num %= 1000;
if(p>0){
for(int i=0; i<p; i++){
output_str += "M";
}
}
p = num / 100;
num %= 100;
if(p>0){
if(p<4){
for(int i=0; i<p; i++){
output_str += "C";
}
}
else if(p == 4) output_str += "CD";
else if(p < 9){
output_str += "D";
for(int i=0; i<(p-5); i++){
output_str += "C";
}
}
else output_str += "CM";
}
p = num / 10;
num %= 10;
if(p>0){
if(p<4){
for(int i=0; i<p; i++){
output_str += "X";
}
}
else if(p == 4) output_str += "XL";
else if(p < 9){
output_str += "L";
for(int i=0; i<(p-5); i++){
output_str += "X";
}
}
else output_str += "XC";
}
if(num>0){
if(num<4){
for(int i=0; i<num; i++){
output_str += "I";
}
}
else if(num == 4) output_str += "IV";
else if(num < 9){
output_str += "V";
for(int i=0; i<(num-5); i++){
output_str += "I";
}
}
else output_str += "IX";
}
return output_str;
}
};
解法2:
class Solution {
public:
string intToRoman(int num) {
int values[]={
1000,900,500,400,100,90,50,40,10,9,5,4,1};
string reps[]={
"M","CM","D","CD","C","XC","L","XL","X","IX","V","IV","I"};
string res;
for(int i=0; i<13; i++){
while(num>=values[i]){
num -= values[i];
res += reps[i];
}
}
return res;
}
};