1044 火星数字 (20 分)
火星人是以 13 进制计数的:
例如地球人的数字 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>
using namespace std;
int main() {
string a[13] = { "tret","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 n;
cin >> n;
string p;
getchar();//因为不知道输入的是数字还是字符串,还是带空格的字符串,后面使用getline()需要在这里接收输入的回车
for (int i = 0; i < n; i++) {
getline(cin, p);
if (p[0] >= '0' && p[0] <= '9') {//如果得到的p是数字就转火星文
int m = 0;
int x = 1;
m = stoi(p);//将p转为int
int y = 0;
if (m >= 13)//如果m大于等于13,就需要输出高位了
{
cout << b[m / 13];
y = 1;
}
if (y == 1 && m % 13 != 0)cout << " " << a[m % 13];//在有高位的情况下,低位为零不输出
else if (y == 0)cout << a[m];//没有高位,随便输出
p = "";
cout << "\n";
}
else {//如果p为字符串,就给转成数字
string h, l;
int m = 0, k = 0;
for (int j = 0; j < p.length(); j++) {
if (p[j] != ' ')h += p[j];//以空格为分界线区分两个字符串
else {
l = h;
h = "";
}
}
for (int i = 0; i < 13; i++) {//因为可能没有空格,所以h可能为高位也可能为低位
if (h == a[i])m = i;
if (h == b[i])k = i;
if (l == b[i])k = i;
}cout << k * 13 + m << endl;
}
}
}
【总结】
这次练习做的时间有点长,因为没有办法处理输出的对应关系,于是做着做着就直接穷举了。。虽然最后做出来了,但是代码太丑了,怕大家笑话我,这里就不放出来了,还是看看人家的思路怎么样吧。