整数转罗马数字
罗马数字是通过添加从最高到最低的小数位值的转换而形成的。将小数位值转换为罗马数字有以下规则:
如果该值不是以 4 或 9 开头,请选择可以从输入中减去的最大值的符号,将该符号附加到结果,减去其值,然后将其余部分转换为罗马数字。
如果该值以 4 或 9 开头,使用 减法形式,表示从以下符号中减去一个符号,例如 4 是 5 (V) 减 1 (I): IV ,9 是 10 (X) 减 1 (I):IX。仅使用以下减法形式:4 (IV),9 (IX),40 (XL),90 (XC),400 (CD) 和 900 (CM)。
只有 10 的次方(I, X, C, M)最多可以连续附加 3 次以代表 10 的倍数。你不能多次附加 5 (V),50 (L) 或 500 (D)。如果需要将符号附加4次,请使用 减法形式。
给定一个整数,将其转换为罗马数字。

cpp
class Solution {
public:
vector<string> ROMA_THOUSAND = {"", "M", "MM", "MMM"};
vector<string> ROMA_HUNDREAD = {"", "C", "CC", "CCC", "CD",
"D", "DC", "DCC", "DCCC", "CM"};
vector<string> ROMA_TEN = {"", "X", "XX", "XXX", "XL",
"L", "LX", "LXX", "LXXX", "XC"};
vector<string> ROMA_ONE = {"", "I", "II", "III", "IV",
"V", "VI", "VII", "VIII", "IX"};
string intToRoman(int num) {
string ans = ROMA_THOUSAND[num / 1000] +
ROMA_HUNDREAD[num % 1000 / 100] +
ROMA_TEN[num % 100 / 10] + ROMA_ONE[num % 10];
return ans;
}
};
或者
emmm,
cpp
class Solution {
public:
vector<int> ROMA_TABLE = {1000, 500, 100, 50, 10, 5, 1};
vector<char> ROMA_FIGURE = {'M', 'D', 'C', 'L', 'X', 'V', 'I'};
vector<string> ROMA_FIGURE_FOUR = {
"CD",
"XL",
"IV",
};
vector<string> ROMA_FIGURE_NINE = {
"CM",
"XC",
"IX",
};
string subMaxFigure(int num, int carry) {
string tmp_str = "";
int tmp_num = num;
while (carry != 0) {
tmp_num *= 10;
carry--;
}
for (int i = 0; i < ROMA_TABLE.size();) {
if (tmp_num == 0) {
return tmp_str;
}
if (tmp_num - ROMA_TABLE[i] >= 0) {
tmp_str += ROMA_FIGURE[i];
tmp_num = tmp_num - ROMA_TABLE[i];
} else {
i++;
}
}
return tmp_str;
}
string intToRoman(int num) {
vector<int> num_list(4); // 最大数值是3999,4位数
vector<char> ch_list;
string ans = "";
int index = 0;
while (num != 0) {
num_list[num_list.size() - 1 - index] = num % 10;
num = num / 10;
index++;
}
index = 0;
// 去掉开头的0;
while (num_list[index] == 0) {
index++;
}
while (index < num_list.size()) {
if (num_list[index] == 4) {
ans += ROMA_FIGURE_FOUR[index - 1];
} else if (num_list[index] == 9) {
ans += ROMA_FIGURE_NINE[index - 1];
} else {
ans +=
subMaxFigure(num_list[index], num_list.size() - index - 1);
}
index++;
}
return ans;
}
};
罗马数字转整数
https://leetcode.cn/problems/roman-to-integer/description/
cpp
class Solution {
public:
unordered_map<char, int> RomaSymbol = {
{'I', 1}, {'V', 5}, {'X', 10}, {'L', 50},
{'C', 100}, {'D', 500}, {'M', 1000},
};
int romanToInt(string s) {
int ans = 0;
int last_num = 0;
for (int i = 0; i < s.size(); i++) {
int value = RomaSymbol[s[i]];
if (i < s.size() - 1 && value < RomaSymbol[s[i + 1]]) {
ans -= value;
} else {
ans += value;
}
}
return ans;
}
};