火星人是以 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对应的是tam,而不是tam tret。代码有点长,应该能精简一下。
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
char mars_nums[][5] = { "tret", "jan","feb","mar", "apr", "may",
"jun", "jly", "aug", "sep", "oct", "nov", "dec" };
char high_nums[][4] = { "tam", "hel", "maa", "huh", "tou", "kes", "hei",
"elo", "syy", "lok", "mer", "jou" };
void EtoM(char* s);
void MtoE(char* s);
int main()
{
int n, i = 0;
char input[10];
char ch;
scanf("%d", &n);
getchar();
while (n--) {
i = 0;
while ((ch = getchar()) != '\n')
input[i++] = ch;
input[i] = '\0';
if (strlen(input) == 1) {
printf("%s", mars_nums[input[0] - '0']);
}
else if (input[0] >= '0' && input[0] <= '9') {
EtoM(input);
}
else {
MtoE(input);
}
printf("\n");
}
return 0;
}
void EtoM(char* s)
{
int num = atoi(s);
int stack[10];
int top = -1;
do {
stack[++top] = num % 13;
num /= 13;
} while (num);
if (stack[0] == 0)
printf("%s", high_nums[stack[1] - 1]);
else {
while (top != -1) {
if (top == 0)
printf("%s", mars_nums[stack[top]]);
else
printf("%s ", high_nums[stack[top] - 1]);
top--;
}
}
}
void MtoE(char* s)
{
int i, j;
i = j = 0;
int res = 0;
if (strlen(s) <= 4) {
for (; i < 13; i++) {
if (strcmp(s, mars_nums[i]) == 0) {
printf("%d", i);
return;
}
}
for (i = 0; i < 12; i++) {
if (strcmp(s, high_nums[i]) == 0)
printf("%d", (i + 1) * 13);
}
}
else {
char tmp[5];
char* t = s;
while (*t != ' ') {
tmp[i++] = *t;
t++;
}
tmp[i] = '\0';
for (j = 0; j < 12; j++) {
if (strcmp(tmp, high_nums[j]) == 0)
res += (j + 1) * 13;
}
t++;
i = 0;
while (*t) {
tmp[i++] = *t;
t++;
}
tmp[i] = '\0';
for (j = 0; j < 13; j++) {
if (strcmp(tmp, mars_nums[j]) == 0)
res += j;
}
printf("%d", res);
}
}