火星人是以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
解题思路:这是一道类似求任意进制的题目,难点在于:
一,输入。输入的数据里有数字与字符串,通过程序可以判断出来,并将数字字符转换为整型。
二,不同进制之间的转换,参考我们比较熟悉的16进制就可以知道任意进制转换的算法,关键是求余数。
代码如下:
(1)比较两字符串是否相同,用于确定火星文字符代表的数值。
bool isSame(string strA, string strB){
bool flag = true;
for (int i = 0; i < strA.length(); ++i){
if (strA[i] != strB[i]){ flag = false; break; }
}
if (flag)return true;
else return false;
}
(2)输入函数,要求该程序能自动将字符里的数字字符转换为整型,这样以后可以较方便处理。
int N,p=0,sN,num=0,k=0;
string g[100] = { "" };
int nums[100] = { 0 };
cin >> N;
sN = N;
while (N--){
cin >> g[p];
++p;
}
for (int i = 0; i < sN; ++i){
num = 0;
if (g[i][0] <= '9'&&g[i][0] >= '0'){
int len = g[i].length();
for (int j = 0; j< g[i].length(); ++j){
num += ((int)g[i][j] - 48)*pow(10,--len);
}
nums[k++] = num;
}
}
(3)两种不同进制之间的转换
string Mars[13] = { "tret", "jan", "feb", "mar", "apr", "may", "jun", "jly", "aug", "sep", "oct", "nov", "dec" };
string MarsPro[12] = { "tam", " hel", " maa", "huh", "tou", "kes", "hei", "elo", "syy", "lok", " mer", "jou" };
int num = 115;
int temp = 0;
int a=0,b = 0;
temp = num;
if (temp <= 12){ cout << Mars[temp - 1]; }
else{
a = temp / 13;
b = temp % 13;
}
cout << a << " " << b << endl;
cout << MarsPro[a-1] << " "<<Mars[b] << endl;
string numStr[2] = { "elo", "nov" };
string numA = { "aug" };
int k = 0, m = 0,v=1;
if (v == 2){
for (int i = 0; i < 12; ++i){
if (isSame(numStr[0], MarsPro[i])){
k = i;
break;
}
}
for (int i = 0; i < 13; ++i){
if (isSame(numStr[1], Mars[i])){
m = i;
break;
}
}
cout << (k + 1) * 13 + m << endl;
}
else{
bool flag = false;
for (int i = 0; i < 12; ++i){
if (isSame(numA, MarsPro[i])){
k = i;
flag = true;
cout << (k + 1) * 13 << endl;
break;
}
}
if (flag==false){
for (int i = 0; i < 13; ++i){
if (isSame(numA, Mars[i])){
m = i;
cout << m << endl;
break;
}
}
}
}