版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
题目链接:点击查看
题目大意:现在规定火星文为十三进制的数字,十位和个位的数都给出(都表示为字符串的形式),现在给出n个询问,每次给出火星文或数字,请输出转换后的结果
题目分析:先强调一个小细节需要注意一下,火星文的整10位不输出后面的那个0!!若是在16进制中,十进制的16代表为0x10,
若在二进制中,十进制的2代表为10,但在这个题目中,火星文的13代表为tam,而不是tam tret
回到正题,这个题目还需要注意一下就是在复制粘贴的时候一定要细心,因为图快,第一次处理火星文的那些字符串的时候有一个字符串被另一个替代掉了。。导致交了一发全都WA了(可能就只有我会犯这么蠢的错误了吧),后来改过这个细节之后又交了一发,虽然不是AC,但起码还是过掉了三个样例的
这个题目我是突发奇想的,想了一个非常巧妙的方法来解决这个题目,相对于其他的方法来说可以省去大量的脑细胞以及让代码看起来很好看。。因为代码量少了嘛
我们在读完题后,若仔细思考一下可以得出,由普通数字转换为火星文相对还是比较简单的,但由火星文转换成普通数字就有点麻烦了,因为火星文的13后面不能带着0,需要很多if和else的配合判断才能达到目的,我于是就想,可以写一个change函数,用来将一个数字转换为火星文,因为题目中的询问最大也小于169,也就是13进制的2位,所以我们可以预处理打个表,用于直接给出火星文然后查询普通数字,若给出的是普通数字,也可以用change函数直接输出答案
直接上代码吧,简单易懂:
#include<iostream>
#include<cstdlib>
#include<string>
#include<cstring>
#include<cstdio>
#include<algorithm>
#include<climits>
#include<cmath>
#include<cctype>
#include<stack>
#include<queue>
#include<list>
#include<vector>
#include<set>
#include<map>
#include<sstream>
#include<unordered_map>
using namespace std;
typedef long long LL;
const int inf=0x3f3f3f3f;
const int N=100;
unordered_map<string,int>vis;
const string str[13]={"tret","jan","feb","mar","apr","may","jun","jly","aug","sep","oct","nov","dec"};//个位
const string str2[13]={"","tam","hel","maa","huh","tou","kes","hei","elo","syy","lok","mer","jou"};//十位
string change(int x)//将数字转换为火星文并返回
{
int A=x/13;
int B=x%13;
if(A&&B)//若十位和个位上都有数字
return str2[A]+" "+str[B];
else if(A&&!B)//若个位为0,则只输出十位
return str2[A];
else//若十位为0,则只输出个位
return str[B];
}
void init()
{
for(int i=0;i<169;i++)//预处理打表
vis[change(i)]=i;
}
int main()
{
// freopen("input.txt","r",stdin);
init();
int w;
cin>>w;
getchar();
while(w--)
{
string s;
getline(cin,s);
if(isdigit(s[0]))//若询问的是数字,直接用change函数返回答案
{
stringstream ss(s);
int num;
ss>>num;
cout<<change(num)<<endl;
}
else
{
cout<<vis[s]<<endl;//如果访问的是火星文,直接用打好的表输出答案
}
}
return 0;
}