PAT 1044火星數字
火星人是以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分析:
由於輸入的既可能是數字也有可能是字串,所以統一宣告為字串,然後判斷字串中首字元是否是數字,如果是,則可以判定輸入的是數字,否則為字串.寫兩個函式,
一個是數字轉字串,一個是字串轉數字.
原始碼:
#include<iostream>
#include<string>
#include<cctype>
#include<algorithm>
using namespace std;
string str1[]={"jan", "feb", "mar","apr", "may","jun", "jly", "aug",
"sep", "oct", "nov", "dec"};
string str2[]={"tam", "hel", "maa", "huh", "tou", "kes", "hei", "elo", "syy",
"lok", "mer", "jou"};
string *p1,*p2,*p3;
string toal(int num)
{
int ge,shi;
ge=num%13;
shi=num/13;
if(ge==0&&shi==0)
return "tret";
else if(ge==0&&shi!=0)
return str2[shi-1];
else if(ge!=0&&shi==0)
return str1[ge-1];
else return (str2[shi-1]+" "+str1[ge-1]);
}
int tonum(string s)
{ if(s=="tret")
return 0;
bool two=false;string s1,s2;int index;int ge,shi;
if(s.length()>4) two=true;//two為真,則表示有兩位數
if(two)
{
index=0;
for(;index<s.length();index++)
{
if(s[index]!=' ')
s2+=s[index];
else break;
}
for(int j=index+1;j<s.length();j++)
s1+=s[j];
}
else s1=s;
if(two)
{
p1=find(str1,str1+12,s1);
ge=p1-str1+1;
p2=find(str2,str2+12,s2);
shi=p2-str2+1;
return shi*13+ge;
}
else{//一位數可能是十位上的數也有可能是個位上的數
p3=find(str1,str1+12,s1);
if(p3==str1+12)
{
p3=find(str2,str2+12,s1);
shi=p3-str2+1;
return shi*13;
}
else{
ge=p3-str1+1;
return ge;
}
}
}
int main()
{
int n;cin>>n;string s;int sum;int gew,shiw;getchar();
for(int i=0;i<n;i++)
{
sum=0;getline(cin,s);
if(isdigit(s[0]))
{
for(int j=0;j<s.length();j++)
sum=sum*10+s[j]-'0';
cout<<toal(sum)<<endl;
}
else
cout<<tonum(s)<<endl;
}
return 0;
}