PAT 乙级 1044 火星数字

本文介绍了一种实现火星文与地球文相互翻译的方法。通过建立高位与低位火星文对照表,文章详细阐述了如何将地球文转换为十三进制数并进一步翻译成火星文,反之亦然。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

1395875-20180628225848237-1308438707.png

输入样例:
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]));
}

转载于:https://www.cnblogs.com/FDProcess/p/9241321.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值