1044 火星數(shù)字

火星人是以 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è)題就解決了。

代碼:

火星數(shù)字

//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;
}
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書(shū)系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容