PAT 乙级 1044.火星数字 C++/Java
火星人是以 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(<),随后 N 行,每行给出一个 [0, 169) 区间内的数字 —— 或者是地球文,或者是火星文。
输出格式:
对应输入的每一行,在一行中输出翻译后的另一种语言的数字。
输入样例:
4
29
5
elo nov
tam
输出样例:
hel mar
may
115
13
C++实现:
1 #include <iostream> 2 #include <algorithm> 3 #include <string> 4 using namespace std; 5 //1044:火星数字 6 void transform(int flag, string s) { 7 string trans[2][13] = { {"tret", "jan", "feb", "mar", "apr", "may", "jun", "jly", "aug", "sep", "oct", "nov", "dec"},{"","tam", "hel", "maa", "huh", "tou", "kes", "hei", "elo", "syy", "lok", "mer", "jou"} }; 8 if (flag == 0) { 9 int num = stoi(s); 10 if (num < 13) { 11 cout << trans[0][num] << endl; 12 } 13 else { 14 cout << trans[1][num / 13] ; 15 if (num % 13 != 0) { 16 cout << " " << trans[0][num % 13] << endl; 17 } 18 else { 19 cout << endl; 20 } 21 } 22 } 23 else { 24 int res = 0; 25 if (s.length() > 3) { 26 string h = s.substr(0, 3); 27 string l = s.substr(4, 3); 28 for (int i = 0; i < 13; i++) { 29 if (h == trans[1][i]) { 30 res += i * 13; 31 } 32 if (l == trans[0][i]) { 33 res += i; 34 } 35 } 36 } 37 else { 38 for (int i = 0; i < 13; i++) { 39 if (s == trans[0][i]) { 40 res = i; 41 } 42 if (s == trans[1][i]) { 43 res = i * 13; 44 } 45 } 46 } 47 cout << res << endl; 48 } 49 } 50 int main() { 51 int n; 52 cin >> n; 53 getchar(); 54 string s; 55 int flag; 56 for (int i = 0; i < n; i++) { 57 getline(cin, s); 58 if (isdigit(s[0])) { //数字 59 flag = 0; 60 } 61 else { 62 flag = 1; 63 } 64 transform(flag, s); 65 } 66 return 0; 67 }
Java实现: