1. 程式人生 > >PAT-B1044 火星數字(20)

PAT-B1044 火星數字(20)

1044 火星數字(20)(20 分)

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

分析:

最大數字為168,也就是說火星文最長為兩位。需要注意的是,如果火星文進位後低位為0,那麼火星文的表示只有高位,例如,13轉換成火星文是"tam",而不是"tam tret",同理,26轉換成火星文是"hel".

程式碼:

#include <iostream>
#include <vector>
#include <string>
#include <cstdio>


using namespace std;


int main()
{
    vector<string> lower = {"tret", "jan", "feb", "mar", "apr", "may", "jun", "jly", "aug", "sep", "oct", "nov", "dec"};
    vector<string> higher = {"tret", "tam", "hel", "maa", "huh", "tou", "kes", "hei", "elo", "syy", "lok", "mer", "jou"};
    string in;
    vector<string> tem;//儲存輸入的每個“數字”
    int i, j, fig, n;//fig用來儲存轉換過程中的阿拉伯數字


    cin >> n;
    getchar();
    for(i = 0; i < n; i++)
    {
        getline(cin, in);
        tem.push_back(in);
    }
    for(i = 0; i < n; i++)
    {
        in = tem[i];
        fig = 0;
        if(isdigit(in[0]))//地球轉火星
        {
            for(j = 0; j < in.size(); j++)
                fig = fig * 10 + (int)(in[j] - '0');//和stoi(in)等價
            //fig = stoi(in);
            int h = fig / 13, l = fig % 13;//得到火星文高位和低位的數字表示
            if(h != 0)//火星文高位不為零,輸出高位
                cout << higher[h];
            if(h != 0 && l != 0)//高位和低位都不為零,輸出空格
                cout << " ";
            if(l != 0)//如果火星文低位為0,只輸出高位
                cout << lower[l];
            if(fig == 0)
                cout << "tret";
            if(i != n - 1)
                cout << endl;
        }
        else //火星轉地球
        {
            //不確定測試樣例會不會給出"tret may"這樣的高位為“tret”的情況
            //所以選擇用>4判斷
            if(in.size() > 4) //兩位火星文
            {
                string h = in.substr(0, in.find(' '));
                string l = in.substr(in.find(' ') + 1);
                for(j = 0; j < higher.size(); j++)
                {
                    if(h == higher[j])
                    {
                        fig += j * 13;
                        break;
                    }
                }
                for(j = 0; j < lower.size(); j++)
                {
                    if(l == lower[j])
                    {
                        fig += j;
                        break;
                    }
                }
            }
            else//一位火星文
            {
                //只有高位的火星文(低位為0)
                for(j = 0; j < higher.size(); j++)
                {
                    if(in == higher[j])
                    {
                        fig = 13 * j;
                        break;
                    }
                }
                //只有低位的火星文
                for(j = 0; j < lower.size(); j++)
                {
                    if(in == lower[j])
                    {
                        fig = j;
                        break;
                    }
                }
            }
            cout << fig;
            if(i != n - 1)
                cout << endl;
        }
    }
    return 0;
}