一、概述
给一个数,求其罗马数字形式。
很简单的一道题,映射即可。
二、分析
我们观察可知,对于题目范围的罗马数字,1~3999,共可能出现以下几种情况:
Symbol Value I 1 V 5 X 10 L 50 C 100 D 500 M 1000
但是只有这些还不够,对于4,40,400,9,90,900来说,还有特殊形式。因此我们选择把特殊形式也直接提取出来。然后由大到小削减即可。
其实我的方法还不够暴力——最暴力的方法是把每位十进制数对应的罗马数字直接翻译出来,一共也就4位*10种=40种情况。
然后按位输出即可,但是也没比我快多少。
三、总结
想到对应的话就很简单,要是一点一点判断的话会麻烦死,逻辑很复杂。
PS:代码如下:
class Solution {
public:
string intToRoman(int num) {
vector<string> m;
/*m[0]="M";
m[1]="DM";
m[2]="D";
m[3]="CD";
m[4]="C";
m[5]="LC";
m[6]="L";
m[7]="XL";
m[8]="X";
m[9]="IX";
m[10]="V";
m[11]="IV";
m[12]="I";*/
m={"M","CM","D","CD","C","XC","L","XL","X","IX","V","IV","I"};
string ans;
while(num/1000>0)
{
ans+=m[0];
num=num-1000;
}
while(num/900>0)
{
ans+=m[1];
num=num-900;
}
while(num/500>0)
{
ans+=m[2];
num=num-500;
}
while(num/400>0)
{
ans+=m[3];
num=num-400;
}
while(num/100>0)
{
ans+=m[4];
num=num-100;
}
while(num/90>0)
{
ans+=m[5];
num=num-90;
}
while(num/50>0)
{
ans+=m[6];
num=num-50;
}
while(num/40>0)
{
ans+=m[7];
num=num-40;
}
while(num/10>0)
{
ans+=m[8];
num=num-10;
}
while(num/9>0)
{
ans+=m[9];
num=num-9;
}
while(num/5>0)
{
ans+=m[10];
num=num-5;
}
while(num/4>0)
{
ans+=m[11];
num=num-4;
}
while(num>0)
{
ans+=m[12];
num=num-1;
}
return ans;
}
};