水利建設(shè)工程網(wǎng)站市場調(diào)研報告萬能模板
題目鏈接
1044 火星數(shù)字
題目描述
火星人是以 13 進(jìn)制計數(shù)的:地球人的 0 被火星人稱為 tret。
地球人數(shù)字 1 到 12 的火星文分別為:jan, feb, mar, apr, may, jun, jly, aug, sep, oct, nov, dec。
火星人將進(jìn)位以后的 12 個高位數(shù)字分別稱為:tam, hel, maa, huh, tou, kes, hei, elo, syy, lok, mer, jou。
例如地球人的數(shù)字 29 翻譯成火星文就是 hel mar;而火星文 elo nov 對應(yīng)地球數(shù)字 115。為了方便交流,請你編寫程序?qū)崿F(xiàn)地球和火星數(shù)字之間的互譯。輸入格式:
輸入第一行給出一個正整數(shù) N(<100),隨后 N 行,每行給出一個 [0, 169) 區(qū)間內(nèi)的數(shù)字 —— 或者是地球文,或者是火星文。輸出格式:
對應(yīng)輸入的每一行,在一行中輸出翻譯后的另一種語言的數(shù)字。輸入樣例:
4
29
5
elo nov
tam
輸出樣例:
hel mar
may
115
13
題目大意
給你一個新定義的進(jìn)制,讓你完成阿拉伯?dāng)?shù)字和新進(jìn)制的互相轉(zhuǎn)換
解題思路
本題是個非常麻煩的題,要注意的點非常多,在注釋中我也有比較詳細(xì)的標(biāo)注,下面我來說一說需要注意的幾個點
- 第一個就是輸入要用
getline
而不是cin
,因為輸入的火星文可能是兩位,中間需要帶空格,可以看【經(jīng)驗】關(guān)于區(qū)分cin、getline、cin.getline三種字符串輸入的區(qū)別 - 注意在輸入完
n
個要轉(zhuǎn)換的數(shù)字后需要加一個getchar
來讀取回車符,因為getline
不同于cin
,會把回車符當(dāng)做第一個字符串輸入
int n;cin>>n;//這個getchar非常重要!!//因為下面是用getline來讀取字符串,// 沒有這個getchar吞掉輸入整形n以后的回車(也就是\n),// 下面的字符串s會認(rèn)為輸入的第一個字符串是換行符getchar();
- 當(dāng)判斷輸入的第
i
個字符串時,可以通過s[0]
是不是數(shù)字來判斷是阿拉伯?dāng)?shù)字
還是火星文
- 如果是
數(shù)字
,可以通過C++11
中的stoi
來將字符串轉(zhuǎn)化為整形方便運算,具體可以看【經(jīng)驗】關(guān)于c++11中string類型字符串和整形相互轉(zhuǎn)化的用法,同時,測試點2
和測試點4
也是阿拉伯?dāng)?shù)字轉(zhuǎn)化為火星文的問題,具體看下面對測試點2
和測試點4
的解釋即可 - 如果是
字母
,說明是火星文
.因為火星文不管個位還是十位,最多單個位數(shù)只有4
個字符,當(dāng)字符串的總長度比4
大時,說明火星文既有個位又有十位,否則只有個位或者十位(這里可能只有十位沒有個位,具體看下面解釋)
- 如果是
- 需要注意火星文中能被整除的情況是不需要輸出
個位0
的,這里可以參考下面關(guān)于測試點4
解釋中舉的例子
測試點2
是當(dāng)輸入地球的0時應(yīng)該輸出一個tret
測試點4
是當(dāng)輸入能被13
整除的非零地球文字時,火星文應(yīng)該只輸出十位,不輸出個位(比如輸入13
,輸出的應(yīng)該是tam
而不是tam tret
)
題解
#include<bits/stdc++.h>
using namespace std;
string a[13]={"tret","jan","feb","mar","apr","may","jun","jly","aug","sep","oct","nov","dec"};
string b[13]={"","tam","hel","maa","huh","tou","kes","hei","elo","syy","lok","mer","jou"};
int main(){int n;cin>>n;//這個getchar非常重要!!//因為下面是用getline來讀取字符串,// 沒有這個getchar吞掉輸入整形n以后的回車(也就是\n),// 下面的字符串s會認(rèn)為輸入的第一個字符串是換行符getchar();for(int i=0;i<n;i++){string s;//主要這個地方只能用getline不能用cin//因為輸出的火星文可能為兩位,中間有個空格,用cin無法正確保存(比如elo nov)getline(cin,s);if(isdigit(s[0])){ //如果第一位是數(shù)字的話,代表是地球的進(jìn)制//通過C++11的新增函數(shù)將字符串轉(zhuǎn)化為整形//在PAT考試中C++11也是被允許使用的int num = stoi(s);//這里需要提前判斷地球數(shù)字夠不夠外星人的十位,因為// 夠了的話個位前面要有個空格,// 不夠的話個位前面沒有空格//還需要判斷這個地球文字能不能被13整除,// 如果整除輸出只有十位//比如13應(yīng)該輸出tam而不是tam tretif(num%13==0) {if(num!=0) cout<<b[num/13]<<endl;else cout<<"tret"<<endl;}else{if(num>13) cout<<b[num/13]<<" ";cout<<a[num%13]<<endl;}}else{ //此時第一位不是數(shù)字說明是火星文if(s.length()>4){//因為火星文的個位最多就四個字母,// 當(dāng)長度大于4時說明給出的火星文是有十位的,// 小于4則代表只有個位int j=0;while(s[j]!=' ') j++; //找到空格的位置//分別截取火星文的個位和十位string tempb=s.substr(0,j); //代表十位string tempa=s.substr(j+1); //代表個位int sum=0;//判斷火星文個位等于地球的多少for(int k=0;k<15;k++){if(a[k]==tempa){sum+=k;}}//判斷火星文的十位等于地球的多少for(int k=0;k<15;k++){if(b[k]==tempb){sum+=k*13;}}cout<<sum<<endl;}else{//火星文長度小于等于4,說明只有一位//這里注意一個很嚴(yán)重的問題,火星文如果是個位為0的話是不輸出的// 比如(13在火星文中的輸出為tam而不是tam tret)//所以只有一位可能是只有十位,而不是只有一位就是個位for(int j=0;j<15;j++){//因為長度小于4只有一位位,所以找到了就相當(dāng)于當(dāng)前火星文翻譯完成if(s==a[j]){cout<<j<<endl;break;}else if(s==b[j]){cout<<j*13<<endl;break;}}}}}
}