题目要求
代码:千位、百位、十位、个位依次处理
class Solution {
public:
map<int,string> m;
string intToRoman(int num) {
string roman;
//存储数字各个位(个位、十位、百位)上的数
int bitNumber;
mapInit();
bitNumber = num / 1000;
strRomanFun(roman, bitNumber, 1000);
num %= 1000;
bitNumber = num / 100;
strRomanFun(roman, bitNumber, 100);
num %= 100;
bitNumber = num / 10;
strRomanFun(roman, bitNumber, 10);
num %= 10;
bitNumber = num / 1;
strRomanFun(roman, bitNumber, 1);
num %= 1;
return roman;
}
void mapInit()
{
m[1] = "I";
m[4] = "IV";
m[5] = "V";
m[9] = "IX";
m[10] = "X";
m[40] = "XL";
m[50] = "L";
m[90] = "XC";
m[100] = "C";
m[400] = "CD";
m[500] = "D";
m[900] = "CM";
m[1000] = "M";
}
void strRomanFun(string& Roman, int bitNumber, int bit)
{
if (bitNumber == 4)
{
Roman += m[4 * bit];
}
else if (bitNumber == 9)
{
Roman += m[9 * bit];
}
else
{
if (bitNumber / 5)
{
Roman += m[5 * bit];
}
for (size_t i = 0; i < (bitNumber%5); i++)
{
Roman += m[bit];
}
}
}
};
预先设计
在类内定义了一个成员变量map,这样可以三个函数都可以方便的访问到该map。
子功能函数mapInit负责初始化map
子功能函数strRomanFun负责按位追加字符串
整体思路
首先定义一个map,里面储存了数字和与之相对应的罗马字符。
接着按照千位、百位、十位、个位的顺序进行罗马字符的转换:
- 如果该位上的数字等于0,跳过该位
- 如果该位上的数字大于0小于4,则在字符串后面添加相应个数的该位的‘1值’
- 如果该位上的数字等于4,则在字符串后面添加该位的‘4值’
- 如果该位上的数字大于4小于9,则在字符串后面添加该位的‘5值’和剩余的‘1值’
- 如果该位上的数字等于9,则在字符串后面添加该位的‘9值’
以1994举个例子:
一开始字符串初始为空
首先是千位上的数字1,因为1是大于0小于4的,所以应该再字符串后面添加1个千位上的‘1值’,也就是’M’。“M”
接着是百位上的数字9,在字符串后面添加百位的‘9值’,也就是900的’CM’。“MCM”
接着是十位上的数字0,在字符串后面添加十位的‘9值’,也就是90的’XC’。“MCMXC”
最后是个位上的数字4,在字符串后面添加个位的‘4值’,也就是4的’IV’。“MCMXCIV”
学到了什么
1、重新学习了map插入元素的方法
- 用insert插入pair
- 用insert插入value_type
- 用array的方法
m[1] = "I";
本题中我使用了第三种方法,需要注意的是,如果map里面原来就存在有一个值,这种方法会把旧值给覆盖掉。