火星人是以 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、getline的使用。
2、另一种输入方式: cin>>n,getchar();//读取换行符。
3、第一次提交之后发现,如果是39这样的转火星文,是不需要输出低位的0(tret)的。可以直接输入maa,而不是maa tret。所以后面加入了判断后就通过了。
4、我写的这种判断方式太麻烦了,后面借鉴了别人的方式,结果没错,但是调试时觉得仍有问题。贴下连接。借鉴思路后,写的我的代码。
5、反思:这里的输出思路是这样的:什么时候输出高位,什么时候输出空格,什么时候输出低位。
PAT-1044 火星数字 (20 分)
下面是我的代码(20):
//借鉴之后的第二次代码
#include<iostream>
#include <string>
using namespace std;
string lowMarsLan[13]={"tret","jan","feb","mar","apr", "may", "jun", "jly", "aug", "sep", "oct","nov", "dec"};
string highMarsLan[13]={"tret","tam", "hel", "maa", "huh", "tou", "kes", "hei", "elo", "syy", "lok", "mer", "jou"};
int main(int argc, char *argv[])
{
string n;
getline(cin,n);
int N = stoi(n);
while(N--)
{
string str;
getline(cin,str);
//判断是火星文还是地球文,区别在于是否有空格。
if(isdigit(str[0]))
{
//地球文转火星文
int decNum = stoi(str);//只考虑两位,
if(decNum/13)//什么时候输出高位
{
cout<<highMarsLan[decNum/13];
}
if((decNum/13)&&(decNum%13))//什么时候输出空格?1、是个两位的或行为并且最后一位不为零的时候。
{
cout<<" ";
}
if((decNum%13)||(decNum==0))//什么时候输出低位,decNum==0或者两位数但是低位不为0的时候
{
cout<<lowMarsLan[decNum%13];
}
cout<<endl;
}
else//如果输入是火星文。elo nov
{
int lowNum=0;int highNum=0;
string low=str;
string high = low;
if(str.find(' ')!=str.npos)
{
high =str.substr(0,3);
low = str.substr(4);
}
for(int i=0;i<13;i++)//这里比较巧妙。如果说high是低位的,那么根本不会匹配上。
{
if(low==lowMarsLan[i]) lowNum=i;
if(high==highMarsLan[i]) highNum=i;
}
cout<<(highNum*13+lowNum)<<endl;
}
}
return 0;
}
//第一次AE的代码
#include<iostream>
#include <string>
#include <sstream>
#include <vector>
using namespace std;
string lowMarsLan[13]={"tret","jan","feb","mar","apr", "may", "jun", "jly", "aug", "sep", "oct","nov", "dec"};
string highMarsLan[13]={"tret","tam", "hel", "maa", "huh", "tou", "kes", "hei", "elo", "syy", "lok", "mer", "jou"};
int highmars2Earth(string str)
{
int i =0;
for( i = 0;i<13;i++)
{
if(highMarsLan[i]==str)
{
return i;
}
}
if(i==13)
{
return -1;
}
}
int lowmars2Earth(string str)
{
int i = 0;
for( i = 0;i<13;i++)
{
if(lowMarsLan[i]==str)
{
return i;
}
}
if(i==13)
{
return -1;
}
}
int main(int argc, char *argv[])
{
vector<string> result;
string n;
getline(cin,n);
int N= stoi(n);
while(N--)
{
string str;
getline(cin,str);
if(isdigit(str[0]))//如果是数字,就是地球文转火星文
{
vector<string> mars;
stringstream ss;
ss.clear();
int decNum = stoi(str);
int tmp = decNum;
int i =0;
while(tmp!=0)
{
if(i==0)
{
if(tmp%13!=0)
{
mars.push_back(lowMarsLan[tmp%13]);
}
}
else
{
mars.push_back(highMarsLan[tmp%13]);
}
tmp = tmp/13;
i++;
}//25 1 12
if(decNum==0)
{
mars.push_back(lowMarsLan[0]);
}
for(int j =mars.size()-1;j>=0;j--)
{
if(j==0)
{
ss<<mars[j];
}
else
{
ss<<mars[j];
ss<<" ";
}
}
result.push_back(ss.str());
}
else
{
int resNum=0;
size_t pos = str.find(' ');
if(pos!=str.npos)
{ string high = str.substr(0,3);
int highNum = highmars2Earth(high);
string low = str.substr(4);
int lowNum = lowmars2Earth(low);
resNum =highNum*13+lowNum;
}
else
{
if( lowmars2Earth(str)>=0)
{
resNum = lowmars2Earth(str);
}
else
{
resNum = highmars2Earth(str)*13;
}
}
result.push_back(to_string(resNum));
}
}
for(int i =0;i<result.size();i++)
{
cout<<result[i]<<endl;
}
return 0;
}