1. 程式人生 > >1044. 火星數字

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

演算法:

  1. 演算法開始。
  2. 用兩個字串陣列分別儲存0-13的火星文和進位後的火星文。
  3. 讀取正整數N。
  4. 如果i>=N,則跳到第九步。
  5. 以字串形式讀入一行輸入。
  6. 如果這是地球文,則轉化為整型。對此數字除以13取餘,倒序輸出對應字串數組裡的字串。
  7. 如果這是火星文,則首先判斷有幾個火星文,然後與字串陣列進行匹配,加和轉化為地球文輸出。
  8. 回到第四步。
  9. 演算法結束。
時間複雜度為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;
}