传送门:整数转罗马数字
转自:Happyyt
Thought/思路
从规则第
3
3
3 点可以看出,一个符号最多连续
3
3
3 次,然后就必须要改为 小-大
的形式。
比如
9
9
9,不能写成 VIIII
,要写成 IX
。
那么对于一个一位的数字,我们就可以将他分为两种情况:
-
4 4 4 或 9 9 9
-
是否大于 5 5 5,然后再补上剩下的
对于不同位数来说,有如下情况:
-
1 1 1 位:只用到
IVX
-
2 2 2 位:只用到
XLC
-
3 3 3 位:只用到
CDM
-
4 4 4 位:只用到
M
Code/代码
class Solution {
public:
std::string func(int bit, int t) {
std::string tmp = "";
std::string a, b, c;
if (bit == 1) {
a = "I", b = "V", c = "X";
} else if (bit == 2) {
a = "X", b = "L", c = "C";
} else if (bit == 3) {
a = "C", b = "D", c = "M";
} else if (bit == 4) {
a = "M";
}
if (t == 4 || t == 9) {
tmp += (t == 9 ? a + c : a + b);
} else {
tmp += (t / 5 > 0 ? b : "");
for (int j = 1; j <= t % 5; ++ j) tmp += a;
}
return tmp;
}
string intToRoman(int num) {
std::string numStr = std::to_string(num);
std::string ans = "";
for (int i = 1; i <= numStr.length(); ++ i) {
int t = num % 10;
ans = func(i, t) + ans;
num /= 10;
}
return ans;
}
};
StarryCoding 是面向计算机专业学生的综合学习与刷题平台,欢迎同学们的加入!