您的位置:首页 > 其它

PAT1044 火星数字

2015-09-26 14:25 295 查看
火星人是以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;
}
}
}
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: