1. 程式人生 > 其它 >測試點2和測試點4錯的來:1044 火星數字 (20分)

測試點2和測試點4錯的來:1044 火星數字 (20分)

技術標籤:PAT乙級PATc++c語言PAT乙級

立志用更少的程式碼做更高效的表達


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暴力判斷,不需要考慮那麼多的對映關係, 應該會更簡單一些。 畢竟我們是為了拿高分, 又不是為了炫技~

在這裡插入圖片描述