1. 程式人生 > >PAT乙級—1044. 火星數字(20)-native

PAT乙級—1044. 火星數字(20)-native

火星人是以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

思路:此題就是判斷每一行是數字還是火星文,根據第一位判斷如果是數字,求出他的商和餘數對應陣列中的位置即轉換成火星文,如果判斷是火星文,如果對應fire中的值則加上對應下標,如果是jinzhi中的值,則每次乘以13。

#include<iostream>
#include<cstdio>
#include<string>
using namespace std;
int
main(){ int N; cin>>N; string mess; string three=""; string fire[13]={"tret", "jan", "feb", "mar", "apr", "may", "jun", "jly", "aug", "sep", "oct", "nov", "dec"}; string jinzhi[13]={"tam", "hel", "maa", "huh", "tou", "kes", "hei", "elo", "syy", "lok", "mer", "jou"}; int
len,number=0; getchar(); //使用getline時他會將第一次cin>>N的時候回車記錄在內,從而少一次迴圈所以用getchar()捕捉那個回車 for(int i=0;i<N;i++){ getline(cin,mess); if(mess[0]>='0'&&mess[0]<='9'){//如果是數字 for(int j=0;j<mess.size();j++) number=number*10+mess[j]-'0'; if(number<13)//直接輸出對應數字 cout<<fire[number]<<endl; else {//如果大於等於13並且可以被13整除,則根據樣例是不用輸出0(tret)的 if(number%13==0) cout<<jinzhi[number/13-1]<<endl; else cout<<jinzhi[number/13-1]<<" "<<fire[number%13]<<endl;//否則的話要輸入 } } else{//如果是火星文 for(int k=0;k<mess.size();k=k+4){ three=three+mess[k]+mess[k+1]+mess[k+2];//讀取每個火星文 for(int l=0;l<13;l++){ if(three==fire[l])//如果火星文在fire數組裡,那麼它是13進制中的個位數,只需加上座標 number=number+l; if(three==jinzhi[l])//如果在jinzhi陣列中,則每次要乘以13 number=number+(l+1)*13; } three=""; } cout<<number<<endl; } number=0; } return 0; }

題目連結: