题目描述
火星数字是 13进制的
$0 到 12$ 用 13 个字符串表示 tret, jan, feb, mar, apr, may, jun, jly, aug, sep, oct, nov, dec
13*1, 13*2, 13*3, 13*4, 13*5, 13*6, 13*7, 13*8, 13*9, 13*10, 13*11, 13*12
用 12 个字符串表示 tam, hel, maa, huh, tou, kes, hei, elo, syy, lok, mer, jou
算法
用getline 获取一行,然后整行进行解析
如果带有数字, 那么将数字转换为 火星数字
如果 是字符串 那么将字符串转换为 整型数字
由于火星文 只有 两位 所以数字转火星数字, 只要将数字 除以 13, 和 数字 mod 13 进行分析即可
字符串需要 对 一位 和两位的情况 进行讨论
C++ 代码
#include <iostream>
#include <vector>
using namespace std;
vector<string> mapr = {"tret","jan", "feb", "mar", "apr", "may", "jun", "jly", "aug", "sep", "oct", "nov", "dec"};
vector<string> mapl = {"","tam", "hel", "maa", "huh", "tou", "kes", "hei", "elo", "syy", "lok", "mer", "jou"};
string encode(int a) {
if (a <= 12) return mapr[a];
string res;
res += mapl[a/13];
if (a % 13 != 0) {
res += " " + mapr[a%13];
}
return res;
}
string decode(string a) {
if (a.size() == 4) return "0";
if (a.size() <= 3){
for (int i = 1; i < 13; i ++ ) {
if (a == mapr[i]) {
return to_string(i);
}
if (a == mapl[i]) {
return to_string(13*i);
}
}
} else {
int res = 0;
string l, r;
bool is_first = true;
for (int i = 0; i < a.size(); i ++ ) {
if (is_first && a[i] != ' ') {
l.push_back(a[i]);
} else if (a[i] != ' ') {
r.push_back(a[i]);
} else if (a[i] == ' ') {
is_first = false;
}
}
for (int i = 0; i < 13; i ++ ) {
if (l == mapl[i]) {
res += i * 13;
}
if (r == mapr[i]) {
res += i;
}
}
return to_string(res);
}
return "a";
}
string translate(string str){
if (isdigit(str[0])) return encode(stoi(str));
return decode(str);
}
int main() {
int n; cin >> n;
getchar();
while (n--) {
string line;getline(cin, line);
cout << translate(line) << endl;
}
}