题目
火星人是以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 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93
| #include <stdio.h> #include <string.h> #include <ctype.h> #include <stdlib.h>
#define NPOS -11111
const char *low[] = { "tret", "jan", "feb", "mar", "apr", "may", "jun", "jly", "aug", "sep", "oct", "nov", "dec" };
const char *high[] = { "tam", "hel", "maa", "huh", "tou", "kes", "hei", "elo", "syy", "lok", "mer", "jou" };
int marstoi(const char *mars) { for (int i = 0; i < 13; ++i) { if (strcmp(mars, low[i]) == 0) { return i; } } for (int i = 0; i < 12; ++i) { if (strcmp(mars, high[i]) == 0) { return (i + 1) * 13; } }
return NPOS; }
void printInt(char *mars) { char *p = mars; int value = 0;
while (*p) { if (*p == ' ') { *p = '\0'; value = value * 10 + marstoi(mars); mars = ++p; continue; } ++p; } value += marstoi(mars); printf("%d", value); }
void printHigh(int num) { if (num != 0) { printHigh(num / 13); printf("%s", high[num % 13 - 1]); } }
void printMars(int num) { printHigh(num / 13); if (num / 13 != 0 && num % 13 != 0) { printf(" %s", low[num % 13]); } else if (num / 13 == 0) { printf("%s", low[num % 13]); } }
int main(void) { int n; char num[10]; char *tmp;
scanf("%d", &n); getchar(); for (int i = 0; i < n; ++i) { gets(num); if (isdigit(num[0])) { printMars(atoi(num)); } else { printInt(num); } putchar('\n'); }
return 0; }
|