题目:给定一个数字,将其转为罗马文字
思路:
直接贪心法,先从最大的M
开始,如果num比1000
大,那么则除以他后再比,如果除后不大于当前标识符,则除以第二大的900
,依次下去,直到除到个位 I
。类似于找去商店买东西找零。
代码:
std::string Leecode12_intToRoman(int num) {
int values[] = { 1000, 900, 500, 400, 100, 90, 50, 40, 10, 9, 5, 4, 1 };
std::string symbols[] = { "M","CM","D","CD","C","XC","L","XL","X","IX","V","IV","I" };
std::string result;
for (int i = 0; i < sizeof(values) / sizeof(values[0]) && num >= 0; i++) {
while (values[i] <= num) {
num -= values[i];
result.append(symbols[i]);
}
}
return result;
}
另外一种更加快但是不正规的方法:
std::string Leecode12_2_intToRoman(int num) {
std::string thousands[] = { "", "M", "MM", "MMM" };
std::string hundreds[] = { "", "C", "CC", "CCC", "CD", "D", "DC", "DCC", "DCCC", "CM" };
std::string tens[] = { "", "X", "XX", "XXX", "XL", "L", "LX", "LXX", "LXXX", "XC" };
std::string ones[] = { "", "I", "II", "III", "IV", "V", "VI", "VII", "VIII", "IX" };
return thousands[num / 1000] + hundreds[num % 1000 / 100] + tens[num % 100 / 10] + ones[num % 10];
}