1044. 火星数字(20)
火星人是以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
#include<iostream>
#include<string>
#include<cstdio>
using namespace std;
string s,jin[12]={"tam", "hel", "maa", "huh", "tou", "kes", "hei", "elo", "syy", "lok", "mer", "jou"};//0-12
string num[13]={"tret","jan", "feb", "mar", "apr", "may", "jun", "jly", "aug", "sep", "oct", "nov", "dec"};//进制
int is_mar(string s){ //判断是数字还是火星数字
int flag=0;
for (int i=0;i<s.size();i++)
if (s[i]>='a'&&s[i]<='z'){
flag=1;
break;
}
return flag;
}
int martonum(string s){ //把火星数字转为数字
int sum = 0;
int k = s.find(' ');
string s1 = s.substr(0,k); //找到最高位
string s2 = s.substr(k+1,s.size()); //找到最低位
int a=0,b=0; //a表示高位,b表示低位
for (int i=0;i<12;i++)
{
if (s1==jin[i])
{
a = i+1;
break;
}
}
for (int i=0;i<13;i++)
{
if (s2==num[i])
{
b = i;
break;
}
}
return a*13+b;
}
int main(){
int n;
cin>>n;
getchar();
for (int i=0;i<n;i++){
getline(cin,s);
if (is_mar(s)==0){ //如果是数字
int sum=0;
for (int i=0;i<s.size();i++){ //求出数字是多少
sum = s[i]-'0'+sum*10;
}
if (sum==13) //分情况讨论,分为小于13,等于13,和大于13三种情况
cout<<jin[0]<<endl; //等于13,直接输出tam
else if (sum>13){ //大于13,有分为刚好是13的倍数,或其他
cout<<jin[sum/13%13-1]; //首先输出高位
if (sum%13!=0)
cout<<" "<<num[sum%13]<<endl; //如果不是倍数,输出低位
else //否则,输出换行,控制格式
cout<<endl;
}
else
cout<<num[sum]<<endl; //小于13,则输出 相应的火星数字
}
else{
cout<<martonum(s)<<endl;
}
martonum(s);
}
return 0;
}