题目链接:https://www.patest.cn/contests/pat-b-practise/1044
该题目涉及到转换,可采用“打表法”,将所有结果都存入表格,需要转换时自取就可。
由于“火星文”是英文字母,打表时候考虑使用map,将会变得简单可行。
map可以看成下标是指定类型的数组,一般通过一个下标(整型)找到一个string型,利用string数组可以很方便;如果利用string型找到int型,则用map将会非常方便。
例如,定义map<string,int> strToNum; string s=“jan”;
赋值时可以 strToNum[s]=5; 查找时也利用strToNum[s]即可。这里的用法类似于一个数组。
对于此题,还需注意 scanf("%d%*c",&n); 这样getline就会跳过n;
tline(cin,s);即可以读取后面的行。
代码如下:
#include <iostream>
#include <string>
#include <map>
using namespace std;
string unitDig[13]={"tret","jan","feb","mar", "apr", "may",
"jun", "jly", "aug", "sep", "oct", "nov", "dec"};
string tenDig[13]={"tret","tam","hel", "maa", "huh", "tou", "kes", "hei",
"elo", "syy", "lok", "mer", "jou"};
map<string,int> strToNum;
string numToStr[170];
void init(){
for(int i=0;i<13;i++){
strToNum[unitDig[i]]=i;
strToNum[tenDig[i]]=i*13;
numToStr[i]=unitDig[i];
numToStr[i*13]=tenDig[i];
}
for(int i=1;i<13;i++){
for(int j=1;j<13;j++){
string str = tenDig[i]+" "+unitDig[j];
strToNum[str]=i*13+j;
numToStr[i*13+j]=str;
}
}
}
int main()
{
init();
int n;
scanf("%d%*c",&n);
for(int i=0;i<n;i++){
string s;
getline(cin,s);
if(s[0]>='0'&&s[0]<='9'){
int num=0;
for(int i=0;i<s.length();i++)
num = num*10 + (s[i]-'0');
cout<<numToStr[num]<<endl;
} else{
cout<<strToNum[s]<<endl;
}
}
return 0;
}