火星人是以 13 进制计数的:
例如地球人的数字 29
翻译成火星文就是 hel mar
;而火星文 elo nov
对应地球数字 115
。为了方便交流,请你编写程序实现地球和火星数字之间的互译。
输入第一行给出一个正整数 N(<),随后 N 行,每行给出一个 [0, 169) 区间内的数字 —— 或者是地球文,或者是火星文。
对应输入的每一行,在一行中输出翻译后的另一种语言的数字。
4
29
5
elo nov
tam
hel mar may 115 13
思路1:
这道题我丧心病狂的用了暴力枚举。。把所有可能的情况都列出来保存到字符串数组 allMarsNum ,同时将 allMarsNum 里的字符串都保存到哈希表 m ,可以根据火星数字返回对应的十进制数
当输入的十进制数字为 n ,就输出 allMarsNum[n] 的字符串
当输入的数字为火星数字 str ,就输出 m[str]
麻烦一点的是枚举法,要找到规律
像 0,1,2,... 12,这种属于低位数字,将对应的地位数字赋值到 allMarsNum[0,1,2...12]
像13,26, 39,52,65,78,91,104,117,130,143,156共12个数,都是13的倍数,所以他们对应的火星数就是高位数字,将对应的高位数字赋值到 allMarsNum[13,26,39....156]
像14~25,高位都是 tam ,低位分别为 "jan", "feb", "mar", "apr", "may", "jun", "jly", "aug", "sep", "oct", "nov", "dec"
像27~38,高位都是 hel ,低位和上面一样
我用了一个 base 来区分是13,26,39....156的高位
当 base = 13 14~ 25这个区间的数,就是 tam + x , 这里只要按照循环顺序,把低位数字加进去就好了
思路2:
待补充
C++实现:
#include <iostream> #include <string> #include <unordered_map> using namespace std; bool isNum(string str) { int len = str.size(); for (int i = 0; i < len; ++i) { if (str[i] < ‘0‘ || str[i] > ‘9‘) { return false; } } return true; } int main() { string marsLowNum[13] = { "tret", "jan", "feb", "mar", "apr", "may", "jun", "jly", "aug", "sep", "oct", "nov", "dec" }; string marsHighNum[13] = { "","tam", "hel", "maa", "huh", "tou", "kes", "hei", "elo", "syy", "lok", "mer", "jou" }; string allMarsNum[200]; // 低位赋值 for (int i = 0; i < 13; ++i) { allMarsNum[i] = marsLowNum[i]; } int base = 13; for (int i = 13; i < 169; ++i) { if (i % 13 == 0) { allMarsNum[i] = marsHighNum[i / 13]; base = i; continue; } allMarsNum[i] = allMarsNum[base] + ‘ ‘ + marsLowNum[i - base]; } unordered_map<string, int> m; for (int i = 0; i < 169; ++i) { m[allMarsNum[i]] = i; } int N; cin >> N; cin.get(); string input; while (N--) { getline(cin, input); if (isNum(input)) { cout << allMarsNum[stoi(input)] << endl; } else { cout << m[input] << endl; } } return 0; }
Java实现:
原文:https://www.cnblogs.com/47Pineapple/p/12227330.html