PAT A1100 火星数字(Mars Numbers)

PAT A1100 火星数字(Mars Numbers)

原题地址

需要用到的知识及注意点

  • map,string
  • 进制转换(数字转换为字符串的功能用hash表则不需要)
  • 输入13,输出应为tam, 而不是tam tret(测试点2,4和这个有关)

代码1

(更简洁的见代码2, 此处仅记录)

#include 
#include 
#include 
#include 

using namespace std;

map chart;//火星字符串到地球十进制的映射
string digit1[13] = {"tret", "jan", "feb", "mar", "apr", "may", "jun", "jly", "aug", "sep", "oct", "nov", "dec"};
string digit2[13] = {"tret", "tam", "hel", "maa", "huh", "tou", "kes", "hei", "elo", "syy", "lok", "mer", "jou"};


string earthToMars(int a)
{//实现十进制到13进制的字符串转换,也可以使用hash表直接对应。
    if(a < 13)
    {
        return digit1[a];
    }
    else
    {
        int z[2], num = 0;
        do{//十进制数转换为13进制数
            z[num++] = a % 13;
            a = a / 13;
        }while(a != 0);
        if(z[0] != 0)
        {
            string temp = digit2[z[1]] + " " + digit1[z[0]];
            return temp;    
        } else{
            string temp = digit2[z[1]];
            return temp;
        }
    }
}

void initChart()
{//设置chart表
    for(int i = 0; i < 13; i++)
    {
        for(int j = 0; j < 13; j++)
        {
            chart[digit2[i] + " " + digit1[j]] = i * 13 + j;
        }
    }
    for(int i = 0; i < 13; i++)
    {
        chart[digit1[i]] = i;
        chart[digit2[i]] = i * 13;
        chart[digit2[0] + " " + digit2[i]] = i * 13;
    }
}

int main()
{
    int N;
    scanf("%d", &N);
    getchar();
    initChart();
    for(int i = 0; i < N; i++)
    {
        string str;
        getline(cin, str);
        if(str[0] >= '0' && str[0] <= '9')
        {
            int num = 0;
            for(int j = 0; j < str.length(); j++)
            {
                num = num * 10 + (str[j] - '0');
            }
            cout << earthToMars(num) << endl;
        } else{
            cout << chart[str] << endl;
        }
    }
    return 0;
}

代码二

#include 
#include 
#include 
#include 

using namespace std;

//[0, 12]的火星文
string digit1[13] = {"tret", "jan", "feb", "mar", "apr", "may", "jun", "jly", "aug", "sep", "oct", "nov", "dec"};
//[0, 12]的13倍的火星文
string digit2[13] = {"tret", "tam", "hel", "maa", "huh", "tou", "kes", "hei", "elo", "syy", "lok", "mer", "jou"};

string numToStr[170];//13 * 13 = 169,最多169个映射,数字-》火星文
map strToNum;//火星文-》数字

void init()
{
    for(int i = 0; i < 13; i++)
    {
        numToStr[i] = digit1[i];
        strToNum[digit1[i]] = i;
        numToStr[i * 13] = digit2[i];
        strToNum[digit2[i]] = i * 13;
    }
    for(int i = 1; i < 13; i++)//十位
    {
        for(int j = 1; j < 13; j++)
        {
            string str = digit2[i] + " " + digit1[j];
            numToStr[i * 13 + j] = str;
            strToNum[str] = i * 13 + j;
        }
    }
}

int main()
{
    init();
    int N;
    scanf("%d%*c", &N);
    while (N--)
    {
        string str;
        getline(cin, str);
        if(str[0] >= '0'&& str[0] <= '9')
        {//如果是数字
            int num = 0;
            for(int i = 0; i < str.length(); i++)
            {
                num = num * 10 + (str[i] - '0');
            }
            cout << numToStr[num] << endl;
        }else{
            cout << strToNum[str] << endl;
        }
    }
    return 0;
}

你可能感兴趣的:(PAT)