火星人是以 13 進(jìn)制計(jì)數(shù)的:
- -地球人的 0 被火星人稱為 tret。
- -地球人數(shù)字 1 到 12 的火星文分別為:jan, feb, mar, apr, may, jun, jly, aug, sep, oct, nov, dec。
- -火星人將進(jìn)位以后的 12 個(gè)高位數(shù)字分別稱為:tam, hel, maa, huh, tou, kes, hei, elo, syy, lok, mer, jou。
例如地球人的數(shù)字 29 翻譯成火星文就是 hel mar;而火星文 elo nov 對(duì)應(yīng)地球數(shù)字 115。為了方便交流,請(qǐng)你編寫(xiě)程序?qū)崿F(xiàn)地球和火星數(shù)字之間的互譯。
輸入格式:
輸入第一行給出一個(gè)正整數(shù) N(<100),隨后 N 行,每行給出一個(gè) [0, 169) 區(qū)間內(nèi)的數(shù)字 —— 或者是地球文,或者是火星文。
輸出格式:
對(duì)應(yīng)輸入的每一行,在一行中輸出翻譯后的另一種語(yǔ)言的數(shù)字。
輸入樣例:
4
29
5
elo nov
tam
輸出樣例:
hel mar
may
115
13
思路:
本題難點(diǎn)主要在于判斷輸入的數(shù)據(jù)是什么類型的,是整數(shù)還是單詞,是一個(gè)單詞還是兩個(gè)單詞,根據(jù)不同的類型輸出不同的結(jié)果。
主要的循環(huán)函數(shù)如下:
string temp1, temp2;
for (int i = 0; i < N; i++)
{
cin >> temp1;//首先讀入一個(gè)存在字符串中
if (cin.peek() != '\n')//如果讀了兩個(gè)字符串,那么一定是火星文
{
cin >> temp2;
print(temp1, temp2);
}
else//如果讀了一個(gè)字符,需要判斷讀入的是數(shù)字還是一個(gè)單詞
{
if (temp1[0] >= '0'&&temp1[0] <= '9')//如果讀入的是數(shù)字,將其轉(zhuǎn)化為整型數(shù)
{
int number = stoi(temp1);
print(number);
}
else//如果讀入的是單詞,將其直接輸出
{
print(temp1);
}
}
}
接下來(lái)需要定義一個(gè)三重重載的print函數(shù),分別對(duì)這三種情況進(jìn)行輸出
void print(int n){...}//如果讀入的是數(shù)字,將其轉(zhuǎn)化為13進(jìn)制數(shù)以后輸出火星文
void print(string a){...}//如果只輸入了一個(gè)字符,且是火星文
void print(string a, string b){...}//如果讀入兩個(gè)字符串,證明是火星文
這樣這個(gè)題就解決了。
代碼:
//1044 火星數(shù)字
#include<iostream>
#include<string>
using namespace std;
string bit[13] = { "tret", "jan", "feb", "mar", "apr", "may", "jun", "jly", "aug", "sep", "oct", "nov", "dec" };
string ten[13] = { "\0", "tam", "hel", "maa", "huh", "tou", "kes", "hei", "elo", "syy", "lok", "mer", "jou" };
void print(int n)//如果讀入的是數(shù)字,將其轉(zhuǎn)化為13進(jìn)制數(shù)以后輸出火星文
{
if (n == 0)
{
cout << "tret" << endl;
return;
}
int t = n / 13;
int b = n % 13;
if (b == 0)
{
cout << ten[t] << endl;
return;
}
if (t == 0)
{
cout << bit[b] << endl;
return;
}
cout << ten[t] << ' ' << bit[b] << endl;
return;
}//如果輸入的是數(shù)字
void print(string a)//如果只輸入了一個(gè)字符,且是火星文
{
for (int i = 0; i < 13; i++)
{
if (a == bit[i])
{
cout << i << endl;
return;
}
if (a == ten[i])
{
cout << 13 * i << endl;
return;
}
}
cout << "出錯(cuò)!" << endl;
return;
}
void print(string a, string b)//如果讀入兩個(gè)字符串,證明是火星文
{
int i, j;
for (i = 0; i < 13; i++)
{
if (ten[i] == a)
{
break;
}
}
for (j = 0; j < 13; j++)
{
if (bit[j] == b)
{
break;
}
}
cout << i * 13 + j << endl;
return;
}
int main()
{
int N;
cin >> N;
string temp1, temp2;
for (int i = 0; i < N; i++)
{
cin >> temp1;
if (cin.peek() != '\n')//如果讀了兩個(gè)字符
{
cin >> temp2;
print(temp1, temp2);
}
else//如果讀了一個(gè)字符
{
if (temp1[0] >= '0'&&temp1[0] <= '9')//如果讀入的是數(shù)字,將其轉(zhuǎn)化為整型數(shù)
{
int number = stoi(temp1);
print(number);
}
else//如果讀入的是單詞,將其直接輸出
{
print(temp1);
}
}
}
return 0;
}