PAT (Basic Level) 1044 火星数字(模拟)
題目鏈接:點擊查看
題目大意:現在規定火星文為十三進制的數字,十位和個位的數都給出(都表示為字符串的形式),現在給出n個詢問,每次給出火星文或數字,請輸出轉換后的結果
題目分析:先強調一個小細節需要注意一下,火星文的整10位不輸出后面的那個0!!若是在16進制中,十進制的16代表為0x10,
若在二進制中,十進制的2代表為10,但在這個題目中,火星文的13代表為tam,而不是tam?tret
回到正題,這個題目還需要注意一下就是在復制粘貼的時候一定要細心,因為圖快,第一次處理火星文的那些字符串的時候有一個字符串被另一個替代掉了。。導致交了一發全都WA了(可能就只有我會犯這么蠢的錯誤了吧),后來改過這個細節之后又交了一發,雖然不是AC,但起碼還是過掉了三個樣例的
這個題目我是突發奇想的,想了一個非常巧妙的方法來解決這個題目,相對于其他的方法來說可以省去大量的腦細胞以及讓代碼看起來很好看。。因為代碼量少了嘛
我們在讀完題后,若仔細思考一下可以得出,由普通數字轉換為火星文相對還是比較簡單的,但由火星文轉換成普通數字就有點麻煩了,因為火星文的13后面不能帶著0,需要很多if和else的配合判斷才能達到目的,我于是就想,可以寫一個change函數,用來將一個數字轉換為火星文,因為題目中的詢問最大也小于169,也就是13進制的2位,所以我們可以預處理打個表,用于直接給出火星文然后查詢普通數字,若給出的是普通數字,也可以用change函數直接輸出答案
直接上代碼吧,簡單易懂:
#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"};//個位const string str2[13]={"","tam","hel","maa","huh","tou","kes","hei","elo","syy","lok","mer","jou"};//十位string change(int x)//將數字轉換為火星文并返回 {int A=x/13;int B=x%13;if(A&&B)//若十位和個位上都有數字return str2[A]+" "+str[B];else if(A&&!B)//若個位為0,則只輸出十位return str2[A];else//若十位為0,則只輸出個位return str[B]; }void init() {for(int i=0;i<169;i++)//預處理打表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]))//若詢問的是數字,直接用change函數返回答案{stringstream ss(s);int num;ss>>num;cout<<change(num)<<endl;} else{cout<<vis[s]<<endl;//如果訪問的是火星文,直接用打好的表輸出答案}}return 0; }?
總結
以上是生活随笔為你收集整理的PAT (Basic Level) 1044 火星数字(模拟)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: PAT (Basic Level) 10
- 下一篇: PAT (Basic Level) 10