题目:
火星人是以 13 进制计数的:
- 地球人的 0 被火星人称为 tret。
- 地球人数字 1 到 12 的火星文分别为:jan, feb, mar, apr, may, jun, jly, aug, sep, oct, nov, dec。
- 火星人将进位以后的 12 个高位数字分别称为:tam, hel, maa, huh, tou, kes, hei, elo, syy, lok, mer, jou。
例如地球人的数字 29
翻译成火星文就是 hel mar
;而火星文 elo nov
对应地球数字 115
。为了方便交流,请你编写程序实现地球和火星数字之间的互译。
输入格式:
输入第一行给出一个正整数 N(<100),随后 N 行,每行给出一个 [0, 169) 区间内的数字 —— 或者是地球文,或者是火星文。
输出格式:
对应输入的每一行,在一行中输出翻译后的另一种语言的数字。
输入样例:
4
29
5
elo nov
tam
输出样例:
hel mar
may
115
13
代码:
#include <iostream>
#include <unordered_map> //unordered_map是用于实现键值对的哈希表,与普通的map相比,不会根据键的大小进行排序,平均时间复杂度是常熟级别
#include <string>
using namespace std;
int main() {
unordered_map<string, int> earthToMars = {
{"tret", 0}, {"jan", 1}, {"feb", 2}, {"mar", 3}, {"apr", 4}, {"may", 5},
{"jun", 6}, {"jly", 7}, {"aug", 8}, {"sep", 9}, {"oct", 10}, {"nov", 11}, {"dec", 12},
{"tam", 13}, {"hel", 26}, {"maa", 39}, {"huh", 52}, {"tou", 65}, {"kes", 78},
{"hei", 91}, {"elo", 104}, {"syy", 117}, {"lok", 130}, {"mer", 143}, {"jou", 156}
};
unordered_map<int, string> marsToEarth = {
{0, "tret"}, {1, "jan"}, {2, "feb"}, {3, "mar"}, {4, "apr"}, {5, "may"},
{6, "jun"}, {7, "jly"}, {8, "aug"}, {9, "sep"}, {10, "oct"}, {11, "nov"}, {12, "dec"},
{13, "tam"}, {26, "hel"}, {39, "maa"}, {52, "huh"}, {65, "tou"}, {78, "kes"},
{91, "hei"}, {104, "elo"}, {117, "syy"}, {130, "lok"}, {143, "mer"}, {156, "jou"}
};
int N;
cin >> N;
cin.ignore(); // 忽略换行符
for (int i = 0; i < N; i++) {
string input;
getline(cin, input); //使用getline()函数可以读取一整行的输入,包括其中的空格和换行符
if (isdigit(input[0])) { // 地球文转火星文
int earthNum = stoi(input);
int high = earthNum / 13;
int low = earthNum % 13;
if (high > 0 && low > 0) {
cout << marsToEarth[high * 13] << " " << marsToEarth[low] << endl;
}
else if (high > 0 && low == 0) {
cout << marsToEarth[high * 13] << endl;
}
else {
cout << marsToEarth[low] << endl;
}
}
else { // 火星文转地球文
string marsNum;
int spaceIndex = input.find(" "); //找到字符串的空格的下标索引值
if (spaceIndex != string::npos) { // 输入含有两个火星文
string highPart = input.substr(0, spaceIndex); //substr()可以从原始字符串中的指定位置和长度提取出来一个新的字符串
string lowPart = input.substr(spaceIndex + 1);
int earthNum = earthToMars[highPart] + earthToMars[lowPart];
cout << earthNum << endl;
}
else { // 输入只含有一个火星文
cout << earthToMars[input] << endl;
}
}
}
return 0;
}