/*
题意:给出火星文或者是地球文,给出对应的另一项
解题:
1、用MAP,记录所有的,然后依靠键值对输出对应的
learn && wrong:
1、getline转为cin
2、输出数字,然后换行,记得带个getchar呀!!!
3、思路
数字不超过169,所以用了打表,怎么用呢
1)、先建012的火星文数组,然后012倍火星文的数组
2)、先处理十位为0,个位有数字的情况
在处理十位有数字,个位为0的情况
3)、接着处理个位,十位都有数字的情况
本质:是将字符压入了string数组,用string,int做map,然后将string做下标,统计数字
4)、在主函数里,将输入的作为string,先判断string是数字还是字符,如果是数字,累加形成数字,字符则直接输出
*/
#include <iostream>
#include <map>
#include <string>
#include <cstdio>
using namespace std;
//[0,12]的火星文
string unitdigit[13] = { "tret","jan", "feb", "mar", "apr", "may", "jun", "jly", "aug", "sep", "oct", "nov", "dec" };
//13的[0,12]倍的火星文
string tendigit[13] = { "tret","tam", "hel", "maa", "huh", "tou", "kes", "hei", "elo", "syy", "lok", "mer", "jou" };
string numtostr[170]; //数字->火星文
map<string, int> strtonum; //火星文->数字
void init() {
for (int i = 0;i < 13;++i) {
numtostr[i] = unitdigit[i]; //个位为[0,12],十位为0
strtonum[unitdigit[i]] = i;
numtostr[i * 13] = tendigit[i];
strtonum[tendigit[i]] = 13 * i;
}
for (int i = 1;i < 13;++i) { //十位
for (int j = 1;j < 13;++j) { //个位
string str = tendigit[i] + " " + unitdigit[j]; //火星文 !!!
numtostr[i * 13 + j] = str; //数字->火星文
strtonum[str] = i * 13 + j; //火星文->数字
}
}
}
int main()
{
init(); //打表
int n;
cin >> n;
getchar(); //!!!应该是这里
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;
}
网友评论