測試點2和測試點4錯的來:1044 火星數字 (20分)
阿新 • • 發佈:2021-01-13
立志用更少的程式碼做更高效的表達
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暴力判斷,不需要考慮那麼多的對映關係, 應該會更簡單一些。 畢竟我們是為了拿高分, 又不是為了炫技~