火星人是以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
思路:
1.数字转火星文:10进制数转换成13进制数,由于数字区间是[0,169)所以13进制数最多能有两位数,降低了编程的难度,只需要考虑一位数和两位数。细节在于数字的处理,字符串的处理。进制的转换。
2.火星文转数字:火星文给出了高位和低位,解析火星文时,只要高位的数字x13+低位数字就得道了十进制数。输出即可。细节在于字符串的切割比较。大小判断。
#include<cstdio>
#include<string>
#include<iostream>
#include<cmath>
using namespace std;
string num1[25] = {"tret","jan", "feb", "mar", "apr", "may", "jun", "jly", "aug", "sep", "oct", "nov", "dec","tam", "hel", "maa", "huh", "tou", "kes", "hei", "elo", "syy", "lok", "mer", "jou"};
string num2[13] = {"","tam", "hel", "maa", "huh", "tou", "kes", "hei", "elo", "syy", "lok", "mer", "jou"};
int main(){
void tras1(string s);
void tras2(string s);
int n;
scanf("%d\n",&n);
string input;
while(n--){
getline(cin,input);
if(input[0]>='0'&&input[0]<='9'){
tras1(input);
}else{
tras2(input);
}
}
return 0;
}
//数字转换火星文
void tras1(string s){
int num=0;
int x = 0;
for(int i=s.size()-1 ;i>=0 ;i--){
num += (s[i]-48) * pow(10,x);
x++;
}
if(num<13){
cout<<num1[num]<<endl;
}
else if(num%13==0){
cout<<num2[num/13]<<endl;
}
else{
cout<<num2[num/13]<<" "<<num1[num%13]<<endl;
}
}
//火星文转换为数字
void tras2(string s) {
string a[13] = {"###", "jan", "feb", "mar", "apr", "may", "jun", "jly", "aug", "sep", "oct", "nov", "dec"};
string b[13] = {"###", "tam", "hel", "maa", "huh", "tou", "kes", "hei", "elo", "syy", "lok", "mer", "jou"};
int len = s.length();
if (len == 3) {
for (int j = 1; j <= 12; j++) {
if(s == a[j]){
cout << j << endl;
}
else if(s==b[j]){
cout << 13 * j << endl;
}
}
} else {
int t1 = 0;
int t2 = 0;
string s1 = s.substr(0,3);
string s2 = s.substr(4,3);
for (int j = 1; j <= 12; j++) {
if(s1==b[j]){
t1 = j;
}
if(s2==a[j]){
t2 = j;
}
}
cout << t1 * 13 + t2 << endl;
}
}