题目




知识点
C++标准库utility



题目解释

题解
逐位编码------低位到高位

answer = substr + answer;//不可以交换位置!!!
class Solution {
public:
string intToRoman(int num) {
string answer = "";//存放最终结果
int mo;//mo存放当前要处理的数字
int d = 0;//d表示当前正处理第d位(个位 十位 百位)
char ch_10[] = { 'I','X','C','M' };//1个位 10十位 100 1000
char ch_5[] = { 'V','L','D' };//5个位 50十位 500
while(num > 0){
string substr = "";//临时存放当前位的处理结果
mo = num % 10;
if(mo == 4){//4 IV
substr = substr + ch_10[d] + ch_5[d];//4 IV 1在前,5在后
}else if(mo == 9){//9 IX
substr = substr + ch_10[d] + ch_10[d + 1];//9 IX 1在前,10在后
}else if(mo >= 5 && mo <= 8){
substr.insert(substr.begin(),ch_5[d]);//将字符ch_5[d]插入到字符串substr的开头
for(int i=0 ; i<(mo-5) ;i++){
substr = substr + ch_10[d];//在substr后面加上表示1的字符------I
}
}else{
for(int i=0;i<mo;i++){
substr = substr + ch_10[d];
}
}
answer = substr + answer;//不可以交换位置!!!
d++;
num /= 10;
}//while
return answer;
}
};
大数查表法------高位到低位

const pair<int, string> valueSymbols[] = {
{1000,"M"},
{900,"CM"},
{500,"D"},
{400,"CD"},
{100,"C"},
{90,"XC"},
{50,"L"},
{40,"XL"},
{10,"X"},
{9,"IX"},
{5,"V"},
{4,"IV"},
{1,"I"},
};
class Solution {
public:
string intToRoman(int num) {
string roman;
for (const auto& [value, symbol] : valueSymbols) {
while (num >= value) {
num -= value;
roman += symbol;
}
if (num == 0) {
break;
}
}
return roman;
}
};