1044 火星數字
阿新 • • 發佈:2019-02-16
ext 字符串 沒有 地球 oid not ram 數字 int 1044 火星數字 (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 t
may
分析:因為給出的可能是數字(地球文)也有可能是字母(火星文),所以用字符串s保存每一次的輸入,因為如果是火星文則會出現空格,所以用getline接收一行的輸入~計算string s的長度len,判斷s[0]是否是數字,如果是數字,表示是地球文,則需要轉為火星文,執行func1();如果不是數字,則說明是火星文,需要轉為地func1(int t)中,傳入的值是string轉int後的結果stoi(s),因為數字最大不超過168,所以最多只會輸出兩位火星文,如果t / 13不等於0,說明有高位,所以輸出b[t/13];如果輸出了高位(t/13不等於0)並且t % 13不等於0,說明有高位且有低位,所以此時輸出空格;如果t % 13不等於0,說明有低位,此時輸出a[t % 13];註意,還有個數字0沒有考慮,因為數字0取余13等於0,但是要特別輸出tret,所以在func1的最後一句判斷中加func2()中,t1和t2一開始都賦值0,s1和s2用來分離火星文單詞,因為火星文字符串只可能一個單詞或者兩個單詞,而且一個單詞不會超過4,所以先將一個單詞的賦值給s1,即s1 = s.substr(0, 3);如果len > 4,就將剩
#include <iostream> #include <string> using namespace std; string a[13] = {"tret", "jan", "feb", "mar", "apr", "may", "jun", "jly", "aug", "sep", "oct", "nov", "dec"}; string b[13] = {"####", "tam", "hel", "maa", "huh", "tou", "kes", "hei", "elo", "syy", "lok", "mer", "jou"}; string s;int len; void func1(int t) { if (t / 13) cout << b[t / 13]; if ((t / 13) && (t % 13)) cout << " "; if (t % 13 || t == 0) cout << a[t % 13]; } void func2() { int t1 = 0, t2 = 0; string s1 = s.substr(0, 3), s2; if (len > 4) s2 = s.substr(4, 3); for (int j = 1; j <= 12; j++) { if (s1 == a[j] || s2 == a[j]) t2 = j; if (s1 == b[j]) t1 = j; } cout << t1 * 13 + t2; } int main() { int n; cin >> n; getchar(); for (int i = 0; i < n; i++) { getline(cin, s); len = s.length(); if (s[0] >= ‘0‘ && s[0] <= ‘9‘) func1(stoi(s)); else func2(); cout << endl; } return 0; }
1044 火星數字