PAT-B1044 火星數字(20)
阿新 • • 發佈:2019-01-26
1044 火星數字(20)(20 分)
火星人是以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
分析:
最大數字為168,也就是說火星文最長為兩位。需要注意的是,如果火星文進位後低位為0,那麼火星文的表示只有高位,例如,13轉換成火星文是"tam",而不是"tam tret",同理,26轉換成火星文是"hel".
程式碼:
#include <iostream> #include <vector> #include <string> #include <cstdio> using namespace std; int main() { vector<string> lower = {"tret", "jan", "feb", "mar", "apr", "may", "jun", "jly", "aug", "sep", "oct", "nov", "dec"}; vector<string> higher = {"tret", "tam", "hel", "maa", "huh", "tou", "kes", "hei", "elo", "syy", "lok", "mer", "jou"}; string in; vector<string> tem;//儲存輸入的每個“數字” int i, j, fig, n;//fig用來儲存轉換過程中的阿拉伯數字 cin >> n; getchar(); for(i = 0; i < n; i++) { getline(cin, in); tem.push_back(in); } for(i = 0; i < n; i++) { in = tem[i]; fig = 0; if(isdigit(in[0]))//地球轉火星 { for(j = 0; j < in.size(); j++) fig = fig * 10 + (int)(in[j] - '0');//和stoi(in)等價 //fig = stoi(in); int h = fig / 13, l = fig % 13;//得到火星文高位和低位的數字表示 if(h != 0)//火星文高位不為零,輸出高位 cout << higher[h]; if(h != 0 && l != 0)//高位和低位都不為零,輸出空格 cout << " "; if(l != 0)//如果火星文低位為0,只輸出高位 cout << lower[l]; if(fig == 0) cout << "tret"; if(i != n - 1) cout << endl; } else //火星轉地球 { //不確定測試樣例會不會給出"tret may"這樣的高位為“tret”的情況 //所以選擇用>4判斷 if(in.size() > 4) //兩位火星文 { string h = in.substr(0, in.find(' ')); string l = in.substr(in.find(' ') + 1); for(j = 0; j < higher.size(); j++) { if(h == higher[j]) { fig += j * 13; break; } } for(j = 0; j < lower.size(); j++) { if(l == lower[j]) { fig += j; break; } } } else//一位火星文 { //只有高位的火星文(低位為0) for(j = 0; j < higher.size(); j++) { if(in == higher[j]) { fig = 13 * j; break; } } //只有低位的火星文 for(j = 0; j < lower.size(); j++) { if(in == lower[j]) { fig = j; break; } } } cout << fig; if(i != n - 1) cout << endl; } } return 0; }