PAT 乙级 1044 火星数字

输入样例:
4
29
5
elo nov
tam
输出样例:
hel mar
may
115
13

思路是:

  • 建立两张参照表,分别对应高位火星文和低位火星文
  • 若需要转换到火星文,则首先将地球文字转化为十三进制数,通过查表翻译成火星文
  • 若需要转换到地球文字,则首先要将火星文通过查表转化成十三进制数,再转化十进制数,完成翻译。

需要注意的是:

  • 由于十三进制数可能为 1211 高位为12,低位为11,直接用一个整型变量储存会导致无法分辨出低位和高位导致无法正确翻译成火星文,所以推荐分别用两个变量储存高位和低位。
  • 如果存在输入的火星文只包含一个高位,例如 tam ,为高位的数字 13 ,这是要做好判断,因为有时我们会认为如果只有一个火星文字就代表只有个位。
  • 如果输入的地球文翻译成火星文的时候高位不为 0 且低位为0,这时无需输出低位对应的火星文,而只输出高位对应的火星文。
#include <iostream>
#include <stdio.h>
#include <string.h>
#include <string>
#include <map>
#include <queue>
#include <stack>
#include <algorithm>

using namespace std;

string dictionariesLow[13]=
{
    "tret",
    "jan",
    "feb",
    "mar",
    "apr",
    "may",
    "jun",
    "jly",
    "aug",
    "sep",
    "oct",
    "nov",
    "dec"
};
string dictionariesHigh[13]=
{
    "NULL",
    "tam",
    "hel",
    "maa",
    "huh",
    "tou",
    "kes",
    "hei",
    "elo",
    "syy",
    "lok",
    "mer",
    "jou"
};

int toTen(int high,int low);
int* toThirteen(int x);
int translateToEarth(const string& s);
string translateToMars(int x);
void translate(char** p,int n);

int main()
{
    int n;
    cin>>n;
    char** p=new char*[n];
    for(int i=0; i<n; i++)
        p[i]=new char[10];
    getchar();
    for(int i=0; i<n; i++)
    {
        scanf("%[^\n]",p[i]);
        getchar();
    }
    translate(p,n);
    delete p;
    return 0;
}

int* toThirteen(int x)
{
    int *p=new int[2];
    p[0]=x%13;
    p[1]=x/13;
    return p;
}

int toTen(int high,int low)
{
    return high*13+low;
}

string translateToMars(int x)
{
    int* p=toThirteen(x);
    if(p[1]!=0)
    {
        if(p[0]!=0)
            return dictionariesHigh[p[1]]+" "+dictionariesLow[p[0]];
        else
            return dictionariesHigh[p[1]];
    }
    else
        return dictionariesLow[p[0]];
    delete p;
}

int translateToEarth(const string& s)
{
    int high=0,low=0;
    if(s.find(' ')!=string::npos)
    {
        for(int i=1; i<13; i++)
        {
            if(s.substr(0,s.find(' '))==dictionariesHigh[i])
            {
                high=i;
                break;
            }
        }
        for(int i=0; i<13; i++)
        {
            if(s.substr(s.find(' ')+1)==dictionariesLow[i])
            {
                low=i;
                break;
            }
        }
    }
    else
    {
        bool isOnlyLow=true;
        for(int i=1; i<13; i++)
        {
            if(s==dictionariesHigh[i])
            {
                isOnlyLow=false;
                high=i;
                break;
            }
        }
        if(isOnlyLow)
        {
            for(int i=1; i<13; i++)
            {
                if(s==dictionariesLow[i])
                {
                    low=i;
                    break;
                }
            }
        }
    }
    return toTen(high,low);
}

void translate(char** p,int n)
{
    int x=0;
    for(int i=0; i<n-1; i++)
    {
        x=0;
        if(p[i][0]>='0'&&p[i][0]<='9')
        {
            for(int j=0; j<strlen(p[i]); j++)
                x=x*10+(p[i][j]-'0');
            cout<<translateToMars(x)<<endl;
        }
        else
            cout<<translateToEarth(string(p[i]))<<endl;
    }
    x=0;
    if(p[n-1][0]>='0'&&p[n-1][0]<='9')
    {
        for(int j=0; j<strlen(p[n-1]); j++)
            x=x*10+(p[n-1][j]-'0');
        cout<<translateToMars(x);
    }
    else
        cout<<translateToEarth(string(p[n-1]));
}

猜你喜欢

转载自www.cnblogs.com/FDProcess/p/9241321.html