1044 火星数字
Posted CSU迦叶
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了1044 火星数字相关的知识,希望对你有一定的参考价值。
1. 这题用上了新学的map容器和打表技巧。打表适用于这一题,是因为数据范围1-169很小,map可以将字符串(包括带空格的)映射到int。至于int映射到string,直接用string型数组就可以了。
2. 一个细节注意一下,测试用例中13 对应的只是十位的tam,并不是tam tret。因此可以把数据分为3类处理
- 0,1-12
- 13,26……12*13等13的倍数
- 其他0-168范围内的数
3. 怎样判断输入的是火星文还是地球文?看看第一个字符是字母还是数字
AC代码
#include<cstdio>
#include<map>
#include<string>
#include<cstring>
#include<iostream>
using namespace std;
string lowMars[13] = {"tret","jan","feb","mar","apr","may","jun","jly","aug","sep","oct","nov","dec"};
string hignMars[13] = {"tret","tam","hel","maa","huh","tou","kes","hei","elo","syy","lok","mer","jou"};
string numToStr[170];
map<string,int> strToNum;
void init(){//初始化numToStr和strToNum
//对于0
numToStr[0] = "tret";
for(int i=1;i<=12;i++){
//对于1-12
numToStr[i] = lowMars[i];
// 13的倍数
numToStr[i*13] = hignMars[i];//是的如果个位是0,那么无需表示
//对于其他数
for(int j=1;j<=12;j++){
numToStr[i*13+j] = hignMars[i] + " " + lowMars[j];
}
}
for(int i=0;i<13;i++){
strToNum[lowMars[i]] = i;
strToNum[hignMars[i]] = i*13;
}
for(int i=1;i<=12;i++){
for(int j=1;j<=12;j++){
strToNum[hignMars[i] + " " + lowMars[j]] = i*13+j;
}
}
}
int main(){
int n;
scanf("%d%*c",&n);
init();//打标
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;
}
以上是关于1044 火星数字的主要内容,如果未能解决你的问题,请参考以下文章