原题地址
(更简洁的见代码2, 此处仅记录)
#include #include #include #include using namespace std; map chart;//火星字符串到地球十进制的映射 string digit1[13] = {"tret", "jan", "feb", "mar", "apr", "may", "jun", "jly", "aug", "sep", "oct", "nov", "dec"}; string digit2[13] = {"tret", "tam", "hel", "maa", "huh", "tou", "kes", "hei", "elo", "syy", "lok", "mer", "jou"}; string earthToMars(int a) {//实现十进制到13进制的字符串转换,也可以使用hash表直接对应。 if(a < 13) { return digit1[a]; } else { int z[2], num = 0; do{//十进制数转换为13进制数 z[num++] = a % 13; a = a / 13; }while(a != 0); if(z[0] != 0) { string temp = digit2[z[1]] + " " + digit1[z[0]]; return temp; } else{ string temp = digit2[z[1]]; return temp; } } } void initChart() {//设置chart表 for(int i = 0; i < 13; i++) { for(int j = 0; j < 13; j++) { chart[digit2[i] + " " + digit1[j]] = i * 13 + j; } } for(int i = 0; i < 13; i++) { chart[digit1[i]] = i; chart[digit2[i]] = i * 13; chart[digit2[0] + " " + digit2[i]] = i * 13; } } int main() { int N; scanf("%d", &N); getchar(); initChart(); for(int i = 0; i < N; i++) { string str; getline(cin, str); if(str[0] >= '0' && str[0] <= '9') { int num = 0; for(int j = 0; j < str.length(); j++) { num = num * 10 + (str[j] - '0'); } cout << earthToMars(num) << endl; } else{ cout << chart[str] << endl; } } return 0; }
#include #include #include #include using namespace std; //[0, 12]的火星文 string digit1[13] = {"tret", "jan", "feb", "mar", "apr", "may", "jun", "jly", "aug", "sep", "oct", "nov", "dec"}; //[0, 12]的13倍的火星文 string digit2[13] = {"tret", "tam", "hel", "maa", "huh", "tou", "kes", "hei", "elo", "syy", "lok", "mer", "jou"}; string numToStr[170];//13 * 13 = 169,最多169个映射,数字-》火星文 map strToNum;//火星文-》数字 void init() { for(int i = 0; i < 13; i++) { numToStr[i] = digit1[i]; strToNum[digit1[i]] = i; numToStr[i * 13] = digit2[i]; strToNum[digit2[i]] = i * 13; } for(int i = 1; i < 13; i++)//十位 { for(int j = 1; j < 13; j++) { string str = digit2[i] + " " + digit1[j]; numToStr[i * 13 + j] = str; strToNum[str] = i * 13 + j; } } } int main() { init(); int N; scanf("%d%*c", &N); while (N--) { string str; getline(cin, str); if(str[0] >= '0'&& str[0] <= '9') {//如果是数字 int num = 0; for(int i = 0; i < str.length(); i++) { num = num * 10 + (str[i] - '0'); } cout << numToStr[num] << endl; }else{ cout << strToNum[str] << endl; } } return 0; }