PAT-B 1044. 火星数字
火星人是以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的倍数,输出火星数字时,末位的0不打印。
(老实说,这道题我的代码相当差劲,值得注意的是strstr函数和strcmp函数的使用)
程序代码:
#include<stdio.h>
#include<string.h>
char c_0[][5]={"tret","jan","feb","mar","apr","may","jun", "jly", "aug", "sep", "oct", "nov", "dec"};
char c_1[][4]={"\0","tam", "hel", "maa", "huh", "tou", "kes", "hei", "elo", "syy", "lok", "mer", "jou"};
char in[10][10]={0};
char ans[10]={0};
void num_to_char(int n,char* ans);
void print_mars(char* ans[]);
int main()
{
int n,i=0;
int tmp;
scanf("%d",&n);
getchar();
while(i<n)
{
gets(in[i]);
i++;
}
for(i=0;i<n;i++)
{
memset(ans,0,10);
if(isNum(in[i]))
{
tmp = GetNum(in[i]);
num_to_char(tmp,ans);
printf("%s\n",ans);
}
else
{
tmp = mars_to_earth(in[i]);
printf("%d\n",tmp);
}
}
return 0;
}
int mars_to_earth(char* in)
{
int i=0,sum=0;
for(i=1;i<13;i++)
{
if(strstr(in,c_1[i]))
{
sum = i*13;
break;
}
}
for(i=0;i<13;i++)
{
if(strstr(in,c_0[i]))
{
sum = sum + i;
break;
}
}
return sum;
}
void num_to_char(int n,char* ans)
{
char *p;
int i=0;
if(n>=13)
{
p = c_1[n/13];
while(*p!='\0')
{
ans[i] = *p;
i++;
p++;
}
if(n%13!=0)
{
ans[i] = ' ';
i++;
p = c_0[n%13];
while(*p!='\0')
{
ans[i] = *p;
i++;
p++;
}
ans[i]= '\0';
}
else
{
ans[i] = '\0';
}
}
else
{
p = c_0[n%13];
while(*p!='\0')
{
ans[i] = *p;
i++;
p++;
}
ans[i] = '\0';
}
}
int GetNum(char* s)
{
int num=0;
char *p =s;
while(*p!='\0')
{
num = num*10 + *p - '0';
p++;
}
return num;
}
int isNum(char *s)
{
if(s[0]>='0'&&s[0]<='9')
return 1;
else
return 0;
}