PAT A1100
實質上沒什麼難的,體感表達的意思無非是將十進位制數字轉換為13進位制,然後給出將數字替換成相應的字串;
但是這道題的示例程式碼給出了所謂打表的新思路,之前沒參加過ACM或者OJ比賽,也就沒聽說過;
簡單的來說就是對可能的輸出結果進行計算,在輸入值的時候可以直接按表輸出,減少了不必要的重複計算;
對於程式碼裡,有scanf("%d%*c",&T);
其第二個輸入的目的是跳過輸入;
個人認為其根本目的就是為了清除T後面的換行符;
利用getchar()也可以清除換行符,這裡需要注意一下;
詳細程式碼如下所示:
#include<cstdio> #include<stdlib.h> #include<iostream> #include<string> #include<map> using namespace std; using std::map; string unitDigit[13]={"tret","jan", "feb", "mar", "apr", "may", "jun", "jly", "aug", "sep", "oct", "nov", "dec"}; string tenDigit[13]={"tret","tam", "hel", "maa", "huh", "tou", "kes", "hei", "elo", "syy", "lok", "mer", "jou"}; string numToStr[170]; map<string,int>StrToNum; void init(){ for(int i=0;i<13;i++){ numToStr[i]=unitDigit[i]; StrToNum[unitDigit[i]]=i; numToStr[i*13]=tenDigit[i]; StrToNum[tenDigit[i]]=i*13; } for(int i=1;i<13;i++){ for(int j=1;j<13;j++){ string str=tenDigit[i]+" "+unitDigit[j]; numToStr[i*13+j]=str; StrToNum[str]=i*13+j; } } } int main(){ init(); int T; scanf("%d%*c",&T); while(T--){ string str; getline(cin,str); if(str[0]>='0'&&str[0]<='9'){ int num=0; for(int i=0;i<str.length();i++){ num=num*10+(str[i]-'0'); } cout<<numToStr[num]<<endl; }else{ cout<<StrToNum[str]<<endl; } } system("pause"); return 0; }