测试点2和测试点4错的来:1044 火星数字 (20分)
立志用更少的代碼做更高效的表達
Pat乙級最優化代碼+題解+分析匯總——>傳送門
火星人是以 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
解題思路
題意:讓我們設計一個程序,能自由的完成火星文到地球數字的轉換。
要注意轉換時為13進制。
測試點2和測試點4:
注意讀題:
也就是說:只有0能被稱為tret(既然單獨列出來作為一項規則,說明這個0是特殊的)。
如輸入13,則輸出tam。 而不是tam tret。
代碼展示
#include<bits/stdc++.h> using namespace std; //地球文轉化為火星文的映射 char a[13]={'0','1','2','3','4','5','6','7','8','9','a','b','c'}; map<char, string>m1, m2; //火星文轉化為地球文的映射 map<string, int>m3; int b[300];int main() { m1['0'] = "tret";m1['1'] = "jan"; m1['2'] = "feb"; m1['3'] = "mar"; m1['4'] = "apr";m1['5'] = "may"; m1['6'] = "jun"; m1['7'] = "jly"; m1['8'] = "aug";m1['9'] = "sep"; m1['a'] = "oct"; m1['b'] = "nov"; m1['c'] = "dec";m2['1'] = "tam"; m2['2'] = "hel"; m2['3'] = "maa"; m2['4'] = "huh";m2['5'] = "tou"; m2['6'] = "kes"; m2['7'] = "hei"; m2['8'] = "elo";m2['9'] = "syy"; m2['a'] = "lok"; m2['b'] = "mer"; m2['c'] = "jou";m3["dec"]= 12; m3["jou"]=12*13; m3["nov"]=11; m3["mer"]=11*13;m3["lok"]= 10*13; m3["oct"]=10; m3["syy"]=9*13; m3["sep"]=9;m3["elo"]=8*13; m3["aug"]=8; m3["hei"]=7*13; m3["jly"]=7;m3["kes"]=6*13; m3["jun"]=6; m3["tou"]=5*13; m3["may"]=5;m3["apr"]=4; m3["huh"]=4*13; m3["maa"]=3*13; m3["mar"]=3;m3["hel"]=2*13; m3["feb"]=2; m3["tam"]=1*13; m3["jan"]=1;m3["tret"]=0;int n; cin>>n; getchar(); //吸收空格,記住不要放到循環里 for(int i = 0; i < n; i++) {string s; getline(cin, s);if(isalpha(s[0])) { //如果是字母 stringstream ss;ss << s;string s1,s2;bool flag = false;int num = 0; //累加和 while(ss >> s1) {num += m3[s1];}cout << num << '\n';} else { //如果是數字 stringstream ss; //把字符串轉化成整型int x; ss << s; ss >> x;string s1;if(x < 13) {s1 += a[x];cout << m1[s1[0]] << '\n';}else {s1 += a[x/13];x = x % 13;s1 += a[x];cout << m2[s1[0]];if(m1[s1[1]] != "tret") cout << ' ' << m1[s1[1]];cout << '\n'; } }}return 0; }博主的碎碎念:
這道題做了一個多小時,如果在正式比賽鐵炸了。 主要的難點是測試點2與測試點4, 以及字符串和數字之間的映射問題。 如果單純用if-else暴力判斷,不需要考慮那么多的映射關系, 應該會更簡單一些。 畢竟我們是為了拿高分, 又不是為了炫技~
總結
以上是生活随笔為你收集整理的测试点2和测试点4错的来:1044 火星数字 (20分)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 1043 输出PATest (20分)_
- 下一篇: 测试点2详解:1045 快速排序 (25