题目
火星人是以 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进制的数字,再查找对应出字符串输出;
- 火星转地球文:先查找得出13进制的数,在转换为10进制输出。
PS:在对于读入字符串是地球文还是火星文的判别上,可以根据字符串的长度,也可以根据字符串第一位是数字还是字母来判断,以调用合适的转换函数。
难点
本题主要在一些细节上需要注意:
- 根据例子可知,如果火星文是有进位的,那么低位的0不需要输出;相反,如果火星文只有一个字符串(比如"tam"),那么需要从高位和低位两种情况分别去查找对应的数字;
- 需要读入的字符串可能有空格,因此不可以用scanf,可以选用fgets。
- 根据分析,"tret"只可能在输入为0的时候出现(因为高位为0无需输出,低位为0需要省略)。
代码
/*火星人是以 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 */
#include<stdio.h>
#include<string.h>
#include<stdlib.h>
char dw[12][4] = {{"jan"},{"feb"},{"mar"},{"apr"},{"may"},{"jun"},{"jly"},{"aug"},{"sep"},{"oct"},{"nov"},{"dec"}};
char gw[12][4] = {{"tam"},{"hel"},{"maa"},{"huh"},{"tou"},{"kes"},{"hei"},{"elo"},{"syy"},{"lok"},{"mer"},{"jou"}};
void Earth2Mars(char num[]){ //地球->火星
int a = atoi(num);
if (a==0)
printf("tret\n");
else
{
if (a<13)
printf("%s\n",dw[a-1]);
else
{
printf("%s",gw[a/13-1]);
if (a%13==0)//高位有数字,低位的0不输出
printf("\n");
else
printf(" %s\n",dw[a%13-1]);
}
}
}
void Mars2Earth(char str[]){ //火星->地球
int i,j,len = strlen(str);
char zero[5] = {"tret"};
char a[5],b[5];
int sum = 0;
if (strcmp(str,zero)==0)
printf("0\n");
else
{
for (i=0;i<3;i++)//第一个字符串
a[i] = str[i];
a[i] = '\0';
i++;
if (len>3)//第二个字符串
{
for (j=i;j<len;j++)
b[j-i] = str[j];
b[j-i] = '\0';
for (i=0;i<12;i++)
if (strcmp(b,dw[i])==0)
break;
sum+=(i+1);
}
for (i=0;i<12;i++)
if (strcmp(a,gw[i])==0)
break;
if (i<12)
sum+=(13*(i+1));
else
{
for (i=0;i<12;i++)
if (strcmp(a,dw[i])==0)
break;
sum+=(i+1);
}
printf("%d\n",sum);
}
}
int main(){
int i,N,len;
char a[10];
scanf("%d\n",&N);
for (i=0;i<N;i++)
{
fgets(a,10,stdin);
len = strlen(a);
a[--len] = '\0';//去除结尾的'\n'
if (a[0]>47 && a[0]<59)//输入的是数字,地球->火星
Earth2Mars(a);
else //火星->地球
Mars2Earth(a);
}
return 0;
}