PAT (Basic Level) 1044 火星数字(模拟)
題目鏈接:點(diǎn)擊查看
題目大意:現(xiàn)在規(guī)定火星文為十三進(jìn)制的數(shù)字,十位和個(gè)位的數(shù)都給出(都表示為字符串的形式),現(xiàn)在給出n個(gè)詢問,每次給出火星文或數(shù)字,請(qǐng)輸出轉(zhuǎn)換后的結(jié)果
題目分析:先強(qiáng)調(diào)一個(gè)小細(xì)節(jié)需要注意一下,火星文的整10位不輸出后面的那個(gè)0!!若是在16進(jìn)制中,十進(jìn)制的16代表為0x10,
若在二進(jìn)制中,十進(jìn)制的2代表為10,但在這個(gè)題目中,火星文的13代表為tam,而不是tam?tret
回到正題,這個(gè)題目還需要注意一下就是在復(fù)制粘貼的時(shí)候一定要細(xì)心,因?yàn)閳D快,第一次處理火星文的那些字符串的時(shí)候有一個(gè)字符串被另一個(gè)替代掉了。。導(dǎo)致交了一發(fā)全都WA了(可能就只有我會(huì)犯這么蠢的錯(cuò)誤了吧),后來改過這個(gè)細(xì)節(jié)之后又交了一發(fā),雖然不是AC,但起碼還是過掉了三個(gè)樣例的
這個(gè)題目我是突發(fā)奇想的,想了一個(gè)非常巧妙的方法來解決這個(gè)題目,相對(duì)于其他的方法來說可以省去大量的腦細(xì)胞以及讓代碼看起來很好看。。因?yàn)榇a量少了嘛
我們?cè)谧x完題后,若仔細(xì)思考一下可以得出,由普通數(shù)字轉(zhuǎn)換為火星文相對(duì)還是比較簡(jiǎn)單的,但由火星文轉(zhuǎn)換成普通數(shù)字就有點(diǎn)麻煩了,因?yàn)榛鹦俏牡?3后面不能帶著0,需要很多if和else的配合判斷才能達(dá)到目的,我于是就想,可以寫一個(gè)change函數(shù),用來將一個(gè)數(shù)字轉(zhuǎn)換為火星文,因?yàn)轭}目中的詢問最大也小于169,也就是13進(jìn)制的2位,所以我們可以預(yù)處理打個(gè)表,用于直接給出火星文然后查詢普通數(shù)字,若給出的是普通數(shù)字,也可以用change函數(shù)直接輸出答案
直接上代碼吧,簡(jiǎn)單易懂:
#include<iostream> #include<cstdlib> #include<string> #include<cstring> #include<cstdio> #include<algorithm> #include<climits> #include<cmath> #include<cctype> #include<stack> #include<queue> #include<list> #include<vector> #include<set> #include<map> #include<sstream> #include<unordered_map> using namespace std;typedef long long LL;const int inf=0x3f3f3f3f;const int N=100;unordered_map<string,int>vis;const string str[13]={"tret","jan","feb","mar","apr","may","jun","jly","aug","sep","oct","nov","dec"};//個(gè)位const string str2[13]={"","tam","hel","maa","huh","tou","kes","hei","elo","syy","lok","mer","jou"};//十位string change(int x)//將數(shù)字轉(zhuǎn)換為火星文并返回 {int A=x/13;int B=x%13;if(A&&B)//若十位和個(gè)位上都有數(shù)字return str2[A]+" "+str[B];else if(A&&!B)//若個(gè)位為0,則只輸出十位return str2[A];else//若十位為0,則只輸出個(gè)位return str[B]; }void init() {for(int i=0;i<169;i++)//預(yù)處理打表vis[change(i)]=i; }int main() { // freopen("input.txt","r",stdin);init();int w;cin>>w;getchar();while(w--){string s;getline(cin,s);if(isdigit(s[0]))//若詢問的是數(shù)字,直接用change函數(shù)返回答案{stringstream ss(s);int num;ss>>num;cout<<change(num)<<endl;} else{cout<<vis[s]<<endl;//如果訪問的是火星文,直接用打好的表輸出答案}}return 0; }?
總結(jié)
以上是生活随笔為你收集整理的PAT (Basic Level) 1044 火星数字(模拟)的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: PAT (Basic Level) 10
- 下一篇: PAT (Basic Level) 10