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]));
}

原文地址:https://www.cnblogs.com/FDProcess/p/9241321.html

时间: 2024-11-02 14:09:48

PAT 乙级 1044 火星数字的相关文章

PTA乙级 (*1044 火星数字 (20分))

1044 火星数字 (20分) https://pintia.cn/problem-sets/994805260223102976/problems/994805279328157696 #include <iostream> #include <cstdio> #include <cstring> #include <string> #include <cmath> #include <algorithm> using namesp

PAT乙级1044

题目链接 https://pintia.cn/problem-sets/994805260223102976/problems/994805279328157696 题解 需要注意的几个点: 题目有指出给出的数字范围是[0,169),即0至13*13,所以可知火星文不超两个单词:高位 低位 这点我没注意(只是看了,没有细想) 火星数字低位数字是tret时(即是13的整数倍时),不用输出这个tret. 这一点样例中有暗示,我没完全体会出来,只是看到数字为13时不用输出tret // PAT Bas

1044. 火星数字(20)

1044. 火星数字(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":而

PAT-乙级-1044. 火星数字(20)

1044. 火星数字(20) 时间限制 400 ms 内存限制 65536 kB 代码长度限制 8000 B 判题程序 Standard 作者 CHEN, Yue 火星人是以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,

PAT——1044. 火星数字

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

PAT 1044. 火星数字(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 no

1044 火星数字 (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 对应地球数字 1

1044 火星数字(map+打表)

火星人是以 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 对应地球数字 1

【PAT】B1044 火星数字(20 分)

/* 火星文有两位,第二位为0不输出 */ #include<stdio.h> #include<algorithm> #include<string.h> #include<ctype.h> using namespace std; char arr[20]={0}; char data[13][2][5]={ {"tret","tret"}, {"jan","tam"}, {