题目要求:
火星人是以 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
其实这道题不难,思路很清晰,就是13进制和十进制互相转换的问题。关键在于对于字符串的提取,以及识别。不过题目给的条件非常方便,十进制里最大值不超过168,十三进制里的代表每个数的字符串长度都为3(除了0,长为4)。具体思路不说了,代码如下:
#include<iostream>
#include<string.h>
#include<cmath>
#define M 100
using namespace std;
int main(){
string mar[]={"tam","hel","maa","huh","tou","kes","hei","elo","syy","lok","mer","jou"," "};//大于12的十三进制表示,为了和后面的small数组对齐,最后一位取了空字符串
string small[]={"tret","jan","feb","mar","apr","may","jun","jly","aug","sep","oct","nov","dec"}; //小于12的十三进制表示
int n;
scanf("%d",&n);
getchar();
string answer[M];
string final[M];
int fi[M]={0};
int re[M];
int c1=0;
int c2=0;
for(int i=0;i<n;i++){
getline(cin,answer[i]);
}
for(int i=0;i<n;i++){
if(answer[i][0]<='9' && answer[i][0]>='0'){
re[i]=1;
int l=answer[i].length();
int total=0;
for(int j=0;j<l;j++){
total=pow(10,l-j-1)*(int)(answer[i][j]-'0')+total;
}
int _1=total/13;
int _2=total%13;
if(_1&&_2){
final[c1]=mar[_1-1]+" "+small[_2];;
}
if(!_1&&_2){
final[c1]=small[_2];
}
if(_1&&!_2){
final[c1]=mar[_1-1];
}
if(!_2&&!_1){
final[c1]=small[_2];
}
c1++;
}
else{
re[i]=2;
if(answer[i].length()<5){
int flag=0;
for(int j=0;j<13;j++){
if(answer[i]==small[j]){
flag=j;
}
if(answer[i]==mar[j]){
flag=j;
flag=(flag+1)*13;
}
}
fi[c2]=flag;
c2++;
}
else{
int flag_1=0;
int flag_2=0;
string front;
string after;
front=answer[i].substr(0,3);
after=answer[i].substr(4,answer[i].length()-4);
for(int j=0;j<13;j++){
if(front==mar[j]){
flag_1=j;
}
if(after==small[j]){
flag_2=j;
}
}
fi[c2]=(flag_1+1)*13+flag_2;
c2++;
}
}
}
c1=0;
c2=0;
for(int i=0;i<n;i++){
if(re[i]==2){
cout<<fi[c2]<<endl;
c2++;
}
if(re[i]==1){
cout<<final[c1]<<endl;
c1++;
}
}
return 0;
}
有几个点还是需要注意的,一方面是格式。13的整数,其十三进制转换时,后面不需要跟0(即:tret),如果没注意这个问题,只能够得到16分。