原题干:
火星人是以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
这道题涉及到了进制转换等等内容,但是通过观察可以发现题目中数的范围并不多,[0, 169),所以这里我先进行了打表,将0到168的火星文都计算出来,然后与数字建立映射,这样输入的时候只需要判断输入的是否是数字,然后直接把map容器已经打好的"表"输出即可。
这里应注意读取时应读入一整行数据,因为中间有空格。所以应使用getline,另外在输入第一行正整数后应用getline吸收一个换行符,否则while循环中第一次的getline会读入一个空行。
代码如下:
#include <map>
#include <string>
#include <iostream>
#include <cmath>
using namespace std;
map<string, int> mars_num;
map<int, string> num_mars;
string g[] = {"", "jan", "feb", "mar", "apr", "may", "jun", "jly", "aug", "sep", "oct", "nov", "dec"};
string s[] = {"","tam", "hel", "maa", "huh", "tou", "kes", "hei", "elo", "syy", "lok", "mer", "jou"};
void init(){ //打表
int num = 0; //地球数字
string mars_str, middle; //mars_str为每次的火星数字,middle判断中间是否有空格
for(int i = 0; i <= 12; i++){ //十位
for(int j = 0; j <= 12; j++){ //个位
middle = (num >= 13 && num % 13) ? " " : ""; //判断是否有中间的空格
mars_str = s[i] + middle + g[j]; //生成火星数字
mars_num[mars_str] = num; //写入map中
num_mars[num] = mars_str;
num++;
}
}
num_mars[0] = "tret"; //0要特殊考虑
mars_num["tret"] = 0;
}
int str_num(string num){ //string字符串转int数字
int result = 0;
for(int i = 0; i < num.length(); i++){
result += (int)(num[i] - '0') * pow(10, num.length() - i - 1);
}
return result;
}
int main() {
init();
int cnt;
cin >> cnt;
string input;
getline(cin, input); //吸收一个换行
while(cnt--){
getline(cin, input);
if(input[0] <= '9' && input[0] >= '0') //是数字
cout << num_mars[str_num(input)] <<endl;
else //不是数字
cout << mars_num[input] << endl;
}
return 0;
}