火星人是以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
算法:
- 算法开始。
- 用两个字符串数组分别存储0-13的火星文和进位后的火星文。
- 读取正整数N。
- 如果i>=N,则跳到第九步。
- 以字符串形式读入一行输入。
- 如果这是地球文,则转化为整型。对此数字除以13取余,倒序输出对应字符串数组里的字符串。
- 如果这是火星文,则首先判断有几个火星文,然后与字符串数组进行匹配,加和转化为地球文输出。
- 回到第四步。
- 算法结束。
时间复杂度为O(n),空间复杂度为O(1)。注意:火星文如果个位数为零,那么只需要输出十位数。同样如果遇到只有一个单词的火星文,首先要判断它是否是个位数,再判断它是否是十位数。程序编写于VS2015,修改scanf_s()即可在PAT上AC。
#include <stdio.h>
#include <string.h>
#include <ctype.h>
int main(void) {
char s[10];
char single_digit[][5] = { "tret","jan","feb","mar","apr","may","jun","jly","aug","sep","oct","nov","dec" };
char tens[][4] = { "tam","hel","maa","huh","tou","kes","hei","elo","syy","lok","mer","jou" };
int n, i, j, temp, decade;
scanf_s("%d", &n);
getchar();
for (i = 0; i < n; i++) {
gets_s(s, 10);
if (isdigit(s[0])) {
temp = 0;
for (j = 0; s[j] != '\0'; j++) {
temp = temp * 10 + s[j] - '0';
}
if (temp > 12) {
decade = temp / 13;
temp = temp % 13;
if (temp) {
printf("%s", tens[decade - 1]);
putchar(' ');
puts(single_digit[temp]);
}
else {
puts(tens[decade - 1]);
}
}
else {
puts(single_digit[temp]);
}
}
else {
if (strlen(s) > 4) {
for (j = 0; strstr(s, tens[j]) == NULL; j++);
temp = 13 * (j + 1);
for (j = 0; strstr(s + 4, single_digit[j]) == NULL; j++);
temp += j;
}
else {
for (j = 0; j < 13 && strstr(s, single_digit[j]) == NULL; j++);
if (j < 13) {
temp = j;
}
else {
for (j = 0; strstr(s, tens[j]) == NULL; j++);
temp = (j + 1) * 13;
}
}
printf("%d\n", temp);
}
}
return 0;
}